我想编写一个测试来在线程执行可中断调用时中断它,例如Thread.sleep
.
我想同步两个线程:一个线程调用Thread.sleep
,另一个等待第一个线程开始休眠并用Thread.interrupt
.
如何确保第二个线程在开始睡眠后中断第一个线程?可能吗 ?
我想编写一个测试来在线程执行可中断调用时中断它,例如Thread.sleep
.
我想同步两个线程:一个线程调用Thread.sleep
,另一个等待第一个线程开始休眠并用Thread.interrupt
.
如何确保第二个线程在开始睡眠后中断第一个线程?可能吗 ?
您无法确定,因为例如操作系统可能决定在Thread.sleep
语句之前暂停第一个线程。在实践中,如果您也可以在第二个线程中使用小睡眠以及同步,那应该没问题:
final CountdownLatch start = new CountdownLatch(1);
final Thread t1 = new Thread (new Runnable () {
public void run() {
start.await();
Thread.sleep(1000);
}
});
Thread t2 = new Thread (new Runnable () {
public void run() {
start.await();
Thread.sleep(100); //wait a little to make sure that t1 is asleep
t1.interrupt();
}
});
t1.start();
t2.start();
Thread.sleep(100); //wait to make sure both threads are started
start.countdown();
使用同步器并在从休眠线程休眠之前通知中断线程其锁定。引入一个非常小的延迟(远小于睡眠线程的睡眠时间),唤醒后在睡眠线程上发出中断。
为什么在调用 Thread.sleep 后要中断?中断的产生使得它的效果是相同的,不管它的调用时间是什么,它是在调用 sleep() 之前还是之后。你只想测试一下吗?然后循环轮询,直到线程进入TIMED_WAITING状态:
t1.start();
while (t1.getState()!= Thread.State.TIMED_WAITING) {
Thread.sleep(10);
}
t1.interrupt();
为保证 2 个线程相继启动,您需要使用
join()
例如(忽略处理异常):
Thread t1 = new Thread();
Thread t2 = new Thread();
t1.start();
t2.join();
t2.start();
我没有测试代码,但这里是更多信息的文档: https ://docs.oracle.com/javase/tutorial/essential/concurrency/join.html