2011-05-04 3 views
3

목록 listing 5.11에서이 Thread t 중 하나가 중단되면이 코드는 영원히 기다릴 것입니다 그래서 endGate 래치 (startGate.await()InterruptedException를 던질 수 있기 때문에하는) 공개되지 않습니다?자바 동시성 - JCiP 책에서 5.11

public class TestHarness { 
public long timeTasks(int nThreads, final Runnable task) 
     throws InterruptedException { 
    final CountDownLatch startGate = new CountDownLatch(1); 
    final CountDownLatch endGate = new CountDownLatch(nThreads); 

    for (int i = 0; i < nThreads; i++) { 
     Thread t = new Thread() { 
      public void run() { 
       try { 
        startGate.await(); 
        try { 
         task.run(); 
        } finally { 
         endGate.countDown(); 
        } 
       } catch (InterruptedException ignored) { } 
      } 
     }; 
     t.start(); 
    } 

    long start = System.nanoTime(); 
    startGate.countDown(); 
    endGate.await(); 
    long end = System.nanoTime(); 
    return end-start; 
}} 
+0

왜 먼저 _try_하지? – mre

+0

sthupahsmaht, 그가 그것을 시도하는지에 관계없이. 그것을 고려하여 그것의 유효한 질문은 넓게 사용되고 높이 인용 된 책에서 간행되고있다. –

+2

네, 시도하고 기다립니다. 아직도 누군가가 내가 틀렸다는 것을 설명하기를 희망하면서이 버그가 책에 있다면 믿을 수 없다. – robinmag

답변

1

틀리지 않습니다. 코드가 실제로 중단됩니다. 많은 코드 예제가 독자에게 제공되고 코드 스 니펫이 기능적으로 수행해야하는 작업에 대한 이해를 돕기 위해 작성되었습니다. 개발자가 자신의 코드를 테스트하지 않고 개발자가 직접 코드를 사용할 수있는 것은 아닙니다.

예를 들어 누군가가 자동으로 채워지는 캐시를 만들 것을 요구하고있었습니다.

그 절에서 제시된 Memoizer 클래스는 기술을 설명하기 위해 단지이다 : 누군가가 팀 Peierls이 뒤를 JCiP에서 Memoizer 부분을 지적했다. 유용한 기능이 많지 않으며 생산 준비가 완료된 근처에 아무 것도 없습니다.

어디서나 Memoizer를 사용하거나 조정하려는 유혹을 느낀 MapMaker를 사용하십시오.

http://old.nabble.com/How-to-implement-a-self-populating-memoizer-cache--td30121001.html