[Java] 다중 스레드 만들기

다중 스레드 만들기

복수의 스레드가 실행되는 상황을 자바로 만들어보자.

Thread Class

extends Thread

하나의 스레드를 만들려면 Thread 클래스를 extends 하는 클래스를 만들어야 한다.

run()

스레드의 실행 내용은 run() 메서드 안에 들어가야 한다.

thread.start()

클라이언트 객체가 thread 클래스의 start() 메서드를 실행하면 스레드가 실행된다.

예제

Light 객체

Light 객체가 있다고 가정한다.
Light 객체는 ONOFF 두 가지 상태 중 하나이고, 최초로 생성된 Light는 OFF 상태라고 하자.
ON 상태에서 on_button_pushed()를 실행하면 “반응 없음”이 콘솔 창에 출력되고, OFF 상태에서 on_button_pushed()를 실행하면 “Light On!” 이 실행된다고 하자.

Thread1.java

class Thread1 extends Thread{

    private Light light;

    public void setLight(Light light) {
        this.light = light;
    }

    public void run() {
        try{
            Thread.sleep(4000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("thread 1");
        light.on_button_pushed();
        System.out.println();
    }
}

실행 후 Thread.sleep(4000)에 의해 4초 대기 후 light 객체의 on_button_pushed()를 실행한다.

Thread2.java

class Thread2 extends Thread{

    private Light light;

    public void setLight(Light light) {
        this.light = light;
    }

    public void run() {
        try{
            Thread.sleep(1000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("thread 2");
        light.on_button_pushed();
        System.out.println();
    }
}

실행 후 Thread.sleep(1000)에 의해 1초 대기 후 light 객체의 on_button_pushed()를 실행한다.

Client

public class Main{
    public static void main(String[] args) {
        Light light = new Light();
        Thread1 thread1 = new Thread1();
        thread1.setLight(light);
        Thread2 thread2 = new Thread2();
        thread2.setLight(light);

        thread1.start();
        thread2.start();
    }
}

thread1,2가 light 객체를 공유한다.

출력

thread 2
Light On!

thread 1
반응 없음

thread2가 1초 대기로 먼저 실행되므로 공유하는 light를 ON 상태로 변경한다.
thread1 입장에선 light가 이미 ON이기 때문에 “반응 없음”이 출력된다.

우선순위

thread 간의 우선순위를 setPriority 메서드로 정할 수 있다.
숫자가 높아질수록 우선순위가 커진다.


        thread.setPriority(1);
        thread.setPriority(10);
        thread.setPriority(Thread.MAX_PRIORITY); // = 10
        thread.setPriority(Thread.NORM_PRIORITY); // = 5
        thread.setPriority(Thread.MIN_PRIORITY); // = 1