[JAVA] 작업 스레드 생성과 실행

이민준·2021년 9월 16일
0

java

목록 보기
2/5

작업 스레드 생성과 실행

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

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

자바에서는 작업 스레드도 객체로 생성되기 때문에 클래스가 필요합니다.

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

Thread thread = new Thread(Runnable target);

Runnable은 작업 스레드가 실행할 수 있는 코드를 가지고 있는 객체라고 해서 붙여진 이름입니다.

Runnable은 인터페이스 타입이기 때문에 구현 객체를 만들어 대입해야 합니다.

Runnable에는 run() 메소드 하나가 정의되어 있는데, 구현 클래스는 run()을 재정의해서 작업 스레드가 실행할 코드를 작성해야 합니다. 다음은 Runnable 구현 클래스를 작성하는 방법을 보여줍니다.

class Task implements Runnable {
  public void run(){
     스레드가 실행할 코드
  }
}
Runnable task = new Task();

Thread thread = new Thread(task);

코드를 좀 더 절약하기 위해 Thread 생성자를 호출할 때 Runnable 익명 객체를 매개값으로 사용할 수 있습니다. 오히려 이 방법이 더 많이 사용됩니다.

Thread thread = new Thread(new Runnalbe() {
  public void run(){
  스레드가 실행할 코드
  }
}

작업 스레드는 생성되는 즉시 실행되는 것이 아니라, start() 메소드를 다음과 같이 호출해야만 비로소 실행됩니다.

thread.start();

Beep음을 발생시키면서 동시에 프린팅 하는 작업이 있다고 가정해봅시다.

두개를 동시에 발생시키면 좋겠지만 아래 코드는 비프음을 전부 발생시키고 프린팅하는 수 밖에 없습니다.

import java.awt.*;

public class BeepPrintExample1 {
    public static void main(String[] args) {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        for (int i = 0; i < 5; i++) {
            toolkit.beep();
            try{
                Thread.sleep(500);
            }
                catch(Exception e) {}
        }
        for(int i =0;i<5;i++){
            System.out.println("띵");
            try {
                Thread.sleep(500);
            } catch (Exception e) {
            }
        }
    }
}

하지만 아래와 같이 쓰레드를 하나 만들어서 사용한다면, 동시에 가능 합니다.

public class BeepTask implements Runnable{
    public void run(){
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        for(int i =0; i<5;i++){
            toolkit.beep();
            try{ Thread.sleep(500);}catch(Exception e){}
        }
    }
}

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

또는 아래와 같이 가능합니다.

Thread thread = new Thread(beepTask)를 통해서 선언하는 부분을 아래와 같이 하나로 바꿀 수 있습니다.

Thread thread = new Thread(new Runnable(){
  @Override
  public void run(){
    Toolkit toolkit = Toolkit.getDefailtToolkit();
    for (int i =0;i<5;i++){
    toolkit.beep();
    try{Thread.sleep(500);} catch(Exception e)
  	}
  }
}
profile
러닝커브가 장점인 개발자입니다.

0개의 댓글