Runnable

Runnable은 기존에 extend된 Thread를 Runnable로 바꿔주기만 하면된다.

지금 까지와 동일한 Printer를 예제로 사용

How do code ?

Result

1. Printer Run
2. Searching Printer ... 1
Printer Status ... RUNNABLE
Printer Size ... 1
PRINTER NAME ::Printer :: 25
3. Printer Add more
PRINTING :: A
PRINTING :: B
PRINTING :: C
COMPLETE
Printer Status ... RUNNABLE
Printer Size ... 1
PRINTER NAME ::Printer :: 30
PRINTING :: 1
PRINTING :: 2
PRINTING :: 3
COMPLETE
4. Printer is Empty ...
5. Printer Stop

완성 하고 보니 1-2-3-4-5 순서는 맞는데 Thread.sleep()이 굉장히 많고, 콘솔이 중구난방으로 찍혀있는 모습을 볼수있다

Priority

스레드는 각각 우선순위를 갖는다. 이 우선순위는 쓰레드의 실행시간과 비례하게된다.

priority는 0~ 10까지 설정할 수 있다

이를 적용하여 sleep을 제거해 보도록 한다.

result

1. Printer Run
2. Searching Printer ... 
3. Printer Add More
Printer Status ... RUNNABLE
Printer Size ... 2
4. Printer is Empty ...
5. Printer Stop
PRINTER NAME ::Printer :: 25
PRINTER NAME ::Printer :: 24
PRINTING :: 1
PRINTING :: 2
PRINTING :: 3
PRINTING :: A
PRINTING :: B
PRINTING :: C
COMPLETE
COMPLETE

프린트 작업이 3 과 4 사이에 들어가면 조금 깔끔할 것 같다.

Daemon Thread

다른 일반 쓰레드의 작업을 돕는 보조 쓰레드이다. 일반 쓰레드의 작업이 종료되면 데몬쓰레드도 강제 종료되게 된다. PrinterScheduler=>Printer(daemon)으로 수정 하도록 PrintScheduler를 수정해준다.

public void start(Printer printer){
new Thread(printer){{
    setName("Printer :: "+getId());
    setDaemon(true);
  }}.start();
  printers.remove(printer);
}

result

1. Printer Run
2. Searching Printer ... 
3. Printer Add more
Printer Status ... RUNNABLE
Printer Size ... 2
PRINTER NAME ::Printer :: 24
PRINTING :: A
PRINTING :: B
PRINTING :: C
COMPLETE
4. Printer is Empty ...
5. Printer Stop
PRINTER NAME ::Printer :: 25
PRINTING :: 1
PRINTING :: 2
PRINTING :: 3
COMPLETE

위와 같이 작업을 Daemon Thread에서 실행할 수 있게 된다.

아직 하나의 작업이 4,5이후에 시작되는것을 알 수 있다.

More Details

public void start(Printer printer){
    Thread executor = new Thread(printer) {{
        setName("Printer :: " + getId());
    }};
    executor.start();
    try {
        executor.join();
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    printers.remove(printer);
}

이렇게 Thread.join을 활용하면

1. Printer Run
2. Searching Printer ... 
3. Printer Add more
Printer Status ... RUNNABLE
Printer Size ... 2
PRINTER NAME ::Printer :: 24
PRINTING :: A
PRINTING :: B
PRINTING :: C
COMPLETE
PRINTER NAME ::Printer :: 25
PRINTING :: 1
PRINTING :: 2
PRINTING :: 3
COMPLETE
4. Printer is Empty ...
5. Printer Stop

Scheduler가 Printer의 작업 순서를 기다리게 만들수도 있다.

Last updated