[과제] 경마게임 만들기 | Thread 활용

2023. 12. 20. 23:51· 프로그래밍 언어/Java
목차
  1. 1. 과제
  2. 2. 필요 개념
  3. 3. 해결 과정
  4. 4. 결과
  5.  
728x90

 

결과화면

1. 과제

- 빨간 동그라미를 '말'이라 하고 시작 버튼을 누름과 동시에 각자 달립니다.

- 도착하는 순서대로 등수를 표현해주세요.

 

2. 필요 개념

* Thread

1) 정의

: 스레드는 프로세스 내에서 실행되는 여러 실행 흐름 중 하나로, 가장 작은 실행 단위입니다.

그동안 했던 과제는 main 스레드 하나로 실행해왔던 겁니다..!

 

2) 스레드의 장점

  • 멀티태스킹 : 한 프로세스 내에서 여러 작업을 동시에 수행할 수 있습니다.
  • 자원 공유 : 같은 프로세스 내의 스레드끼리 메모리(데이터, 힙)을 공유합니다.
  • 응답성 향상 : 하나의 스레드가 작업을 수행하는 동안 다른 스레드는 다른 작업을 계속 할 수 있어 프로그램 반응시간이 단축됩니다.

3) 스레드 다룰 때 주의점

  • 동시성 문제 : 여러 스레드가 같은 자원을 동시에 수정하려 할 때 문제가 발생할 수 있습니다.
  • 데이터 무결성 : 스레드 간의 적절한 동기화 없이 데이터를 공유하면 원하지 않는 결과가 나올 수 있습니다. 
    (syncronized블록을 사용해서 해결할 수 있습니다.)

4) 생성 및 실행 방법

 

1️⃣ Thread 클래스를 상속받아 run 메서드를 오버라이드합니다.

public class SimpleThread extends Thread {
    @Override
    public void run() {
        // 스레드가 실행할 작업을 여기에 작성합니다.
        System.out.println("스레드가 실행 중입니다.");
    }

    public static void main(String[] args) {
        // SimpleThread 인스턴스를 생성합니다.
        SimpleThread thread = new SimpleThread();

        // 스레드를 시작합니다.
        thread.start();

        // 메인 스레드의 다른 작업을 계속할 수 있습니다.
        System.out.println("메인 스레드는 다른 작업을 진행 중입니다.");
    }
}

 

2️⃣ Runnable 인터페이스를 구현하여 run 메서드를 정의하고 이를 Thread 객체에 전달합니다.

public class SimpleRunnable implements Runnable {
    @Override
    public void run() {
        // 스레드가 실행할 작업을 여기에 작성합니다.
        System.out.println("스레드가 실행 중입니다.");
    }
}


public class SimpleThreadExample {
    public static void main(String[] args) {
        // Runnable 객체를 생성합니다.
        Runnable task = new SimpleRunnable();

        // 스레드를 생성하고 Runnable 객체를 전달합니다.
        Thread thread = new Thread(task);

        // 스레드를 시작합니다.
        thread.start();

        // 메인 스레드의 다른 작업을 계속할 수 있습니다.
        System.out.println("메인 스레드는 다른 작업을 진행 중입니다.");
    }
}

 

 

 

3. 해결 과정

- GUI 그래픽 코드는 과제 문제에 미리 구현해주셔서 개꿀이었습니다..?

- MyFrame 클래스에서 그래픽을 보여주고 스레드를 생성하고 실행하는 역할을 합니다.

- Horse클래스는 말의 좌표값, 각자 말들을 그리는 메서드, 스레드 실행 메서드(run)을 정의합니다.

 

대략적인 구조를 도식화해봤습니다.

 

MyFrame

 

Horse

 

 

해결하던 도중, 등수 표시하는 데에 에러가 났습니다.

 

첫번째로, List<Horse> passedHorse = new ArrayList<>(); 로 동적배열을 만들고

통과할때마다 통과한 말을 배열에 담아줬습니다.

그리고 말이 결승선에 도달했을 때마다, 리스트 배열의 this의 인덱스에 +1을 해서 등수 표시가 되도록 했습니다.

=> 이 코드로 실행을 하면 등수표시가 안되고 디버깅을 하면 등수표시가 되는 요상한 문제가 있었습니다.

 

두번째로, 정적 변수로 rank=1;로 초기화해주고 rank함수가 실행될때마다 rank를 1씩 증가시켜줬습니다.

이걸로 해결됐습니다.

 

4. 결과

MyFrame

package Day11_HorseGame;

import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyFrame extends Frame{
    public static final int FRAME_WIDTH=800;
    public static final int FRAME_HEIGTH=600;

    private Button btn1 = new Button();
    private Button btn2 = new Button();

    public static final int HORSE_ARR_SIZE=5;
    private Horse[] arr =new Horse[HORSE_ARR_SIZE];

    private boolean start;

    public MyFrame() {
        makeHorse();
        makeMainUi(); //화면구성
        setSize(FRAME_WIDTH, FRAME_HEIGTH);
        setVisible(true);
    }

    public void makeHorse() {
        for(int i=0; i<arr.length; i++){
            arr[i]=new Horse();
        }
    }

    private void makeMainUi(){
        //고급 그래픽
        Panel pNorth = new Panel();
        Panel pCenter = new Panel();

        btn1.setLabel("시작");
        btn1.addActionListener(new MyBtnHandler());
        btn2.setLabel("종료");
        btn2.addActionListener(new MyBtnHandler());

        pNorth.add(btn1);
        pNorth.add(btn2);

        pCenter.setLayout(new GridLayout(HORSE_ARR_SIZE,1));

        for(Horse h:arr){
            pCenter.add(h);
        }

        this.add("North",pNorth);
        this.add("Center", pCenter);
    }

    class MyBtnHandler implements ActionListener {
        Thread t[] = new Thread[HORSE_ARR_SIZE];

        @Override
        public void actionPerformed(ActionEvent e) {
            // Thread(Horse) 생성 및 실행
            if(e.getSource() == btn1){
                for(int i = 0; i < HORSE_ARR_SIZE; i++) {
                    t[i] = new Thread(arr[i]); //스레드 생성
                }
                for(int i = 0; i < HORSE_ARR_SIZE; i++) {
                    t[i].start(); //스레드 실행
                }
            } else if(e.getSource() ==btn2){
                System.exit(0); //종료
            }
        }
    }
};

 

 

Horse

package Day11_HorseGame;

import java.awt.*;
import java.util.*;
import java.util.List;

public class Horse extends Canvas implements Runnable{
    public static final int HORSE_SIZE = 50;

    public static final int RUN_DISTANCE = 700;

    private int x;
    private int y;

    private static int rank = 1;

    public Horse(){
        this.x = 20;
        this.y = 20;
    }

    public void paint(Graphics g){
    g.setColor(Color.RED);
    g.fillOval(x,y,HORSE_SIZE,HORSE_SIZE);


        if(x > RUN_DISTANCE ) {
            rank(g);
        }
    }

    public void rank(Graphics g){
        g.setColor(Color.BLACK);
        g.drawString((rank++)+"등",x-20,y-1);
    }

    @Override
    public void run() {
        Random rnd = new Random();
        while (x <= RUN_DISTANCE){
            this.x += rnd.nextInt(5); //오른쪽으로 좌표이동.
            repaint();
            try {
                Thread.sleep(10);//스레드 실행을 일시정지
            } catch (InterruptedException e) {
                System.out.println("깨어났습니다.");
            }
        }
    }
}

 

 

 

728x90

'프로그래밍 언어 > Java' 카테고리의 다른 글

[JSP] 게시판 만들기 | 1편. 환경 설정 및 JSP 개념 이해  (0) 2024.02.07
[Java]Socket을 활용한 간단한 클라이언트-서버 통신  (1) 2023.12.28
[Java] 제네릭(generic)의 개념과 활용법  (1) 2023.12.19
[과제] UML에 맞게 싱글톤 패턴 적용하기  (0) 2023.12.18
[Java] 싱글톤 패턴 개념 및 구현방법  (0) 2023.12.18
  1. 1. 과제
  2. 2. 필요 개념
  3. 3. 해결 과정
  4. 4. 결과
  5.  
'프로그래밍 언어/Java' 카테고리의 다른 글
  • [JSP] 게시판 만들기 | 1편. 환경 설정 및 JSP 개념 이해
  • [Java]Socket을 활용한 간단한 클라이언트-서버 통신
  • [Java] 제네릭(generic)의 개념과 활용법
  • [과제] UML에 맞게 싱글톤 패턴 적용하기
백엔드 개발자 - 젤리곰
백엔드 개발자 - 젤리곰
오늘도 배움이 있는 하루가 되길 바라는 개발자
백엔드 개발자 - 젤리곰
backend-gummyBear
백엔드 개발자 - 젤리곰
전체
오늘
어제
  • 분류 전체보기 (147)
    • 인프런 김영한 강의 정리 (60)
      • 스프링 핵심원리 기본편 (12)
      • 모든 개발자를 위한 HTTP 웹 기본 지식 (10)
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (3)
      • 자바 ORM 표준 JPA 프로그래밍 기본편 (28)
      • 실전! Querydsl (6)
    • Spring (2)
    • 프로젝트일지 (6)
    • 프로그래밍 언어 (20)
      • Java (17)
      • JavaScript (3)
      • Python (0)
    • 데이터베이스 (4)
      • Oracle (2)
      • ORM (1)
      • SQL 튜닝 (1)
    • 형상관리 (1)
      • Git (0)
    • 알고리즘&자료구조 (34)
      • Algorithm (31)
      • Data Structure (1)
    • CS지식 (4)
    • Cloud (7)
    • 일기 (8)
      • 공부 일기 (3)
      • 독서 일기 (2)
      • 마음 일기 (3)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • jquery와javascript
  • 인프콘
  • 스프링컨텍스트
  • 업캐스팅
  • 객체지향방법론
  • #{}와${}의차이
  • SublimeText단축키
  • 힙자료구조
  • 데이터베이스정규화
  • dfs알고리즘
  • 클라이언트서버통신
  • 다운캐스팅
  • LeetCode200번
  • 인터페이스
  • LeetCode17번
  • 프론트엔드역사
  • 커스텀annotation
  • ORM프레임워크
  • 프론트엔드개발자업무
  • 객체지향의사실과오해

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
백엔드 개발자 - 젤리곰
[과제] 경마게임 만들기 | Thread 활용
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.