实践中的Java并发 - 代码清单5.11

时间:2011-05-04 18:27:44

标签: java concurrency

在JCiP一书的listing 5.11中,如果Thread t中的任何一个被中断(因为startGate.await()可以抛出InterruptedException),此代码将永远等待,因此endGate latch将永远不会被释放?

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; 
}} 

1 个答案:

答案 0 :(得分:1)

你没错。代码实际上会挂起。请记住,他们的许多代码示例都是为了让读者了解代码片段在功能上应该做什么而编写的。他们并不打算让开发人员在没有自己测试的情况下开箱即用。

例如,有人询问有关创建自填充缓存的问题。有人指出JCiP中的Memoizer部分,其中Tim Peierls跟随:

  

Memoizer类就在那里   部分仅用于说明   技术。它缺乏一些有用的东西   功能,它离它不远   生产就绪。

     

在任何地方使用MapMaker   一直试图使用或改编Memoizer。

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