2011-05-04 34 views
3

在JCiP書籍中,listing 5.11,如果Thread t中的任何一個被中斷(因爲startGate.await()可以拋出InterruptedException),這個代碼將永遠等待,因此endGate鎖定永遠不會被釋放?實踐中的Java併發 - 列表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 2011-05-04 18:34:47

+0

sthupahsmaht,無論他是否嘗試。考慮到它正在被廣泛使用和被高度引用的書中出版,這是一個有效的問題。 – 2011-05-04 18:47:09

+2

是的,我試過了,它等待。仍然不能相信這本書是否存在,希望有人能解釋我錯了 – robinmag 2011-05-04 18:51:58

回答

1

你沒有錯。代碼實際上會掛起。請記住,他們的許多代碼示例都是爲了讓讀者瞭解代碼段應該在功能上做什麼而編寫的。他們不打算讓開發人員在沒有測試自己的情況下使用他們的代碼。

例如,有人詢問如何創建自填充緩存。有人指出,在JCiP的Memoizer部分,其中添派爾斯隨後用:

在於 節中提供的Memoizer類是僅用於說明一個 技術。它缺少一些有用的功能 ,而且它不在 生產就緒。

在任何你可能有 的地方使用MapMaker都很想使用或適應Memoizer。

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