작업 스레드 생성과 실행

멀티 스레드로 실행하는 어플리케이션을 개발하려면 먼저 몇 개의 작업을 병렬로 실행할지 결정하고 각 작업별로 스레드를 생성해야 합니다.

 

어떤 자바 어플리케이션이건 메인 스레드는 반드시 존재하기 때문에 메인 작업 이외에 추가적인 병렬 작업의 수만큼 스레드를 생성하면 됩니다.

 

작업 스레드는 객체로 생성되기 때문에 java.lang.Thread 클래스가 필요합니다.

직접 객체화해서 생성해도 되지만, Thread를 상속하여 하위 클래스로 만들어 사용할 수 있습니다.

 

 

 

 

 

 

 

 

 

Thread 클래스로부터 직접 생성

 1. java.lang.Thread 클래스로부터 작업 스레드 객체를 직접 생성하려면 다음과 같이 Runnable을 파라미터로 갖는 생성자를 호출해야 합니다.

Thread thread = new Thread(Runnable r);

 

 

2. Runnable은 인터페이스 타입이기 때문에 구현 객체를 만들어 대입해야 합니다. Runnable에는 run() 메소드가 정의되어 있는데, 구현 클래스는 run()을 재정의하여 작업 스레드가 실행할 코드를 작성해야 합니다. 다음은 Runnable 구현 클래스를 작성하는 방법을 보여줍니다.

class Task implements Runnable {
    public void run() {
        // Code 
    }
}

 

3번 아니면 4번으로 코드 치면됩니다 ( 둘 중 하나 )

 

3. 여기서 주의할 점은 Runnable은 작업 내용만 가지고 있는 객체입니다. 실제 스레드가 아니기 때문에 Runnable 구현 객체를 파라미터로 하는 Thread 생성자로 호출하여야만 작업 스레드가 생성되는 것 입니다.

Runnable task = new Task();
 
이렇게 task 넣어줌(수정) -> Thread thread = new Thread(task);

 

 

4. 아니면 익명 구현 객체를 파라미터로 사용하여 코드를 절약할 수 있습니다.

Thread thread = new Thread(new Runnable() {
    public void run() {
        // Code
    }
});
 

 

 

5. 위 두 가지 방법으로 작업 스레드를 생성하고 나면 start() 메소드로 다음과 같이 호출해야만 실행이 됩니다.

thread.start();

 

 

 

 

 

 

 

 

-사용예-

0.5초 주기로 beep 음을 발생하면서 동시에 프린팅 작업을 한다고 가정해 봅시다.

두 작업은 서로 다른 작업이기에 스레드를 분리해서 작성해야 합니다. 먼저 첫 예제를 살펴봅시다.


1.방법1 (한번에 때려 박기)

BeepPrintExam.java

-실행 결과-

Beep 음이 발생하고 나서, Print가 찍히는 걸 확인 할 수 있습니다. 원하는 건 Beep음과 출력이 동시에 이루어져야 하는데 말입니다.

 

 

beep 음을 발생시키면서 동시에 프린팅을 하려면 두 작업 중 하나를 메인 스레드가 아닌 다른 스레드에서 실행시켜야 합니다. 프린팅은 메인 스레드가 담당하고 비프음을 들려주는 것은 작업 스레드가 담당하도록 수정해봅시다.

 

 

 

 

2.방법2 (분리 함 - Runnalbe방법)

BeepWork.java

BeepPrintExam2.java

 

 

 

 

3.방법3 (분리 함 - Thread 상속 방법)

BeepThread.java

import java.awt.Toolkit;
 
public class BeepThread extends Thread {
    @Override
    public void run() {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        
        for (int i = 0; i < 5; i++) {
            toolkit.beep();
            try { 
            	Thread.sleep(500); 
            } catch (Exception e) {}
        }
    }
}

BeepPrintExam3.java

 
public class BeepPrintExam3 {
    public static void main(String[] args) {
        Thread thread = new BeepThread();
        thread.start();
        
        for (int i = 0; i < 5; i++) {
            System.out.println("Print" + i);
            try { 
            	Thread.sleep(500); 
             } catch(Exception e) {}
        }
    }
 
}