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
来完成相同的测试。有人可以解释吗?
答案 0 :(得分:1)
这是适合子类化的少数情况之一 显式线程而不是在池中使用Runnable: 使用join测试适当的终止。
换句话说,这种方法使您有机会中断测试线程并将其加入以确保它已正确终止。如果使用,则不能以这种方式处理线程,例如-ThreadPoolExecutor
类。
此外,还可以创建一个新线程,并使用Runnable来启动它,例如Thread taker = new Thread(() -> {...});
。请记住,这本书是大约8年前写的,创建Runnable
而不是Thread
的子类会使示例变得更长。