Design Pattern - Multithread Ch10

1,105 views

Published on

아꿈사 스터디 발표자료
http://cafe.naver.com/architect1

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,105
On SlideShare
0
From Embeds
0
Number of Embeds
39
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Design Pattern - Multithread Ch10

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

×