Two-Phase Termination 뒷정리를 하고 나서 자도록 해요JAVA 언어로 배우는 디자인 패턴 입문 – 멀티쓰레드 편<아키텍트를 꿈꾸는 사람들>2008.06.14  현수명
2단계 종료!작업중종료 1단계종료요구종료 처리중종료 2단계종료처리완료
Main:CountupThreadstartisShutdownRequestedfalsedoWorkisShutdownRequestedfalsedoWorkshutdownRequestisShutdownRequestedjointruedoShutdown
Two-Phase Termination CodePublic final void run(){   try {      while ( !isShutdownRequested() ) {doWork();      }   } catch (InterruptedException e) {   } finally {doShutdown();   }종료요구가 있었는가‘try...finally 사용’작업 처리종료 처리
public class CountupThread extends Thread {   private long counter = 0;   private volatile boolean shutdownRequested = false;   public void shutdownRequest() {      shutdownRequested = true;interrupt();   }   public boolean isShutdownRequested() {      return shutdownRequested;   }   public final void run(){      try {         while ( !isShutdownRequested() ) {doWork();         }      } catch (InterruptedException e) {      } finally {doShutdown();      }   private void doWork() throws InterruptedException {      counter++;      System.out.println(“doWork: counter =“+counter);      Thread.sleep(500);   }   private void doShutdown() {       System.out.println(“doShutDown”);   }예제소스public class Main {   public static void main(String[] args) {      System.out.println(“main:BEGIN”);      try {         CountupThread t = new CountupThread();t.start();         Thread.sleep(10000);         t.shutdownRequest();         t.join();      } catch (InterruptedException e) {         e.printStackTrace();      }   }
Two-Phase Termincation패턴TerminatorRequestsshutdown-shutdownRequestedTerminationRequester+shutdownRequest {concurrent}+isShutdownRequested {concurrent}+run { frozen }#doWork#doShutdown
우아하게 종료하는 쓰레드안정성“이제 그만 자야지”라는 엄마의 이야기에 황급히 치우다가장난감을 망가뜨리는 일이 없도록 주의하자생존성장난감을 어질러 놓은채로 잠들지 않도록 하자응답성엄마가 “치우세요”라고 이야기하면 가능한 빨리 치우기 시작하자
생각의 폭을 넓히자Stop 메소드를 사용하지말자   -> 안정성이 보장되지 않음플래그 테스트만으로는 충분하지 않아요   -> sleep 중일때를 대비하여 interrupt 필요함인터럽트 상태 테스트만으로도 충분하지 않아요   -> InterruptedException 을 무시하는경우 고려무거운처리를 하기전에 종료요구를 체크   -> 응답성Join 메소드와 isAlive 메소드   -> 쓰레드가 종료되기를 기다림ExecutorService 인터페이스   -> Two-Phase Termination 패턴이 사용됨
보강1. 쓰레드의 Interrupt 상태   Interrupt() 함수를 호출하면 대상 쓰레드는 항상               InterruptedException 을 통보하는게 아님.2. concurrent 패키지   Java.util.concurrent.CountDownLatch      -> 10개의 일이 모두 끝나기를 기다린다.   Java.util.concurrent.CyclicBarrier      -> 3개의 쓰레드모두 N 단계를 종료할때까지 어떤 쓰레드도           N단계+1 로 나아가지 않는다.3. Volatile   synchronized 는 배타제어와 동기화. Volatile 은 동기화만 이루어짐.   volatile 필드에 입력한 내용은 다른 쓰레드가 곧바로 볼수있음.reorder 가 일어나지 않음.
정리종료하기전에 특정 종료처리를 실행.종료요구 flag 를 이용하여 주기적으로 종료요청 여부판단실행시 예외가 발생하더라도 확실하게 종료 처리를 시키기 위해서 try...finally 사용
ReferenceJava로 배우는 멀티쓰레드패턴 Ch.10
끝감사합니다.soomong80@gmail.com2008.06.14현수명

Design Pattern - Multithread Ch10

  • 1.
    Two-Phase Termination 뒷정리를하고 나서 자도록 해요JAVA 언어로 배우는 디자인 패턴 입문 – 멀티쓰레드 편<아키텍트를 꿈꾸는 사람들>2008.06.14 현수명
  • 2.
    2단계 종료!작업중종료 1단계종료요구종료처리중종료 2단계종료처리완료
  • 3.
  • 4.
    Two-Phase Termination CodePublicfinal void run(){ try { while ( !isShutdownRequested() ) {doWork(); } } catch (InterruptedException e) { } finally {doShutdown(); }종료요구가 있었는가‘try...finally 사용’작업 처리종료 처리
  • 5.
    public class CountupThreadextends Thread { private long counter = 0; private volatile boolean shutdownRequested = false; public void shutdownRequest() { shutdownRequested = true;interrupt(); } public boolean isShutdownRequested() { return shutdownRequested; } public final void run(){ try { while ( !isShutdownRequested() ) {doWork(); } } catch (InterruptedException e) { } finally {doShutdown(); } private void doWork() throws InterruptedException { counter++; System.out.println(“doWork: counter =“+counter); Thread.sleep(500); } private void doShutdown() { System.out.println(“doShutDown”); }예제소스public class Main { public static void main(String[] args) { System.out.println(“main:BEGIN”); try { CountupThread t = new CountupThread();t.start(); Thread.sleep(10000); t.shutdownRequest(); t.join(); } catch (InterruptedException e) { e.printStackTrace(); } }
  • 6.
  • 7.
    우아하게 종료하는 쓰레드안정성“이제그만 자야지”라는 엄마의 이야기에 황급히 치우다가장난감을 망가뜨리는 일이 없도록 주의하자생존성장난감을 어질러 놓은채로 잠들지 않도록 하자응답성엄마가 “치우세요”라고 이야기하면 가능한 빨리 치우기 시작하자
  • 8.
    생각의 폭을 넓히자Stop메소드를 사용하지말자 -> 안정성이 보장되지 않음플래그 테스트만으로는 충분하지 않아요 -> sleep 중일때를 대비하여 interrupt 필요함인터럽트 상태 테스트만으로도 충분하지 않아요 -> InterruptedException 을 무시하는경우 고려무거운처리를 하기전에 종료요구를 체크 -> 응답성Join 메소드와 isAlive 메소드 -> 쓰레드가 종료되기를 기다림ExecutorService 인터페이스 -> Two-Phase Termination 패턴이 사용됨
  • 9.
    보강1. 쓰레드의 Interrupt상태 Interrupt() 함수를 호출하면 대상 쓰레드는 항상 InterruptedException 을 통보하는게 아님.2. concurrent 패키지 Java.util.concurrent.CountDownLatch -> 10개의 일이 모두 끝나기를 기다린다. Java.util.concurrent.CyclicBarrier -> 3개의 쓰레드모두 N 단계를 종료할때까지 어떤 쓰레드도 N단계+1 로 나아가지 않는다.3. Volatile synchronized 는 배타제어와 동기화. Volatile 은 동기화만 이루어짐. volatile 필드에 입력한 내용은 다른 쓰레드가 곧바로 볼수있음.reorder 가 일어나지 않음.
  • 10.
    정리종료하기전에 특정 종료처리를실행.종료요구 flag 를 이용하여 주기적으로 종료요청 여부판단실행시 예외가 발생하더라도 확실하게 종료 처리를 시키기 위해서 try...finally 사용
  • 11.
  • 12.