본문 바로가기
개발/자바

쓰레드 (Thread)

by EPdev 2020. 5. 22.
728x90

Thread .. 단순하게는 "흐름"이라고 생각하면 된다. 하지만 어떠한 흐름일까?

 

예를 들어보자..

메인 쓰레드 하나로만 게임을 만든다고 하면, 유저 공격이 끝나고 몬스터가 공격을 하는 '턴제 게임'이 된다.

코드가 순차적으로 실행되기 때문이다.

하지만, 요즘 게임은 어떤가? 유저가 공격하는 와중에 몬스터도 유저를 공격한다.

즉, 유저와 몬스터의 움직임이 동시에 진행되는 것이다.

우리가 들어본 멀티쓰레딩이란 여러 객체에 쓰레드를 부여해서 "동시성"을 확보하는 것이다.

** RPG 게임에서 많은 몬스터가 제각기로 움직이는데 이게 다 쓰레드라고 생각하면 된다.

 

엄청나게 유용해보인다. 하지만! 컨트롤이 쉽지 않다.

가령 1부터 10까지 출력하는 코드를 만들 때, 아래와 같은 코드가 있다고 하자.

for(int i=1 ; i<=10 ; i++){
	** 쓰레드 생성하는 코드 **
	System.out.println(i);
	** 쓰레드 코드 끝 **
}

1, 2, 3, ... , 10 순서대로 출력될까 ??

답은 No

상황에 따라서 숫자가 아무렇게나 막 나올 것이다.

따라서, 쓰레드를 사용하는게 번거로울 수 있다.

(이를 보완하기 위해 syncronized 같은 많은 장치들이 있으니 그건 멀티쓰레드를 사용하면서 알아가자.)

 

Thread를 사용하는 방법

Thread는 클래스에 상속(extends)해서 사용한다. 다만, 자바에서는 상속이 한번만 가능하기에, 제약이 좀 있다.

그래서 Runnable 이라는 인터페이스를 사용한다.

 

인터페이스란? 2020/05/22 - [개발/자바] - 인터페이스와 추상클래스 - Interface and Abstract Class 을 참고하자.

 

어떻게 Runnable이란 인터페이스로 쓰레드를 만들 수 있는가?

그건 바로 Thread를 생성할 때 만드는 가장 중요한 메소드인 run()이 있는데, 사실 이 run() 메소드가 Runnable 인터페이스의 추상메소드이다.

Thread를 뜯어보면 Runnable을 상속받았고, Runnable이란 객체도 갖고 있다.

class Thread implements Runnable{
	...
}

또 Runnable은 run() 이라는 추상메소드를 가지고 있다.

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

 

 

 

설명이 장황한데 결론은!! Runnable 인터페이스를 이용하면, 쓰레드를 상속받는 것 같이 새 쓰레드를 만들 수 있다.

 

쓰레드로 처리하고 싶은 내용은 run() 이란 함수 안에 코드로 넣으면 된다.

예제는 많으니 찾아보자.

 

쓰레드는 정말 중요하고, 또 많은 내용을 포함하고 있어서 설명이 제대로 된지 모르겠다.

결국 멀티쓰레드를 구현하는데에는 추상적인 사고를 얼마나 잘 할 줄 아느냐가 중요한 것 같다.

계속 고민하고 생각해볼 필요가 있다.

728x90

'개발 > 자바' 카테고리의 다른 글

인터페이스와 추상클래스 - Interface and Abstract Class  (0) 2020.05.22
클래스 (Class)  (0) 2020.05.21
JavaFX  (0) 2020.05.17
자바 (람다식, Lambda Expression)  (0) 2020.05.08
자바 (제네릭, Generic)  (0) 2020.05.08

댓글