扩展线程以测试连接是否正确终止?

时间:2018-11-16 17:08:30

标签: java multithreading concurrency

Java并发实践,12.1.2。测试阻止操作:

void testTakeBlocksWhenEmpty() {
 final BoundedBuffer<Integer> bb = new BoundedBuffer<Integer>(10);
 Thread taker = new Thread() {
  public void run() {
   try {
    int unused = bb.take();
    fail(); // if we get here, it’s an error
   } catch (InterruptedException success) { }
  }
 };
 try {
  taker.start();
  Thread.sleep(LOCKUP_DETECT_TIMEOUT);
  taker.interrupt();
  taker.join(LOCKUP_DETECT_TIMEOUT);
  assertFalse(taker.isAlive());
 } catch (Exception unexpected) {
  fail();
 }
}
  

这是适合子类化的少数情况之一   显式线程而不是在池中使用Runnable:   使用连接测试正确的终止。可以使用相同的方法   测试在元素中放置了接受者线程后是否解除阻塞   由主线程排队。

但是我不知道扩展Thread如何帮助测试。对我来说,似乎可以通过将Runnable传递到Thread来完成相同的测试。有人可以解释吗?

1 个答案:

答案 0 :(得分:1)

  

这是适合子类化的少数情况之一   显式线程而不是在池中使用Runnable:   使用join测试适当的终止。

换句话说,这种方法使您有机会中断测试线程并将其加入以确保它已正确终止。如果使用,则不能以这种方式处理线程,例如-ThreadPoolExecutor类。

此外,还可以创建一个新线程,并使用Runnable来启动它,例如Thread taker = new Thread(() -> {...});。请记住,这本书是大约8年前写的,创建Runnable而不是Thread的子类会使示例变得更长。