[英]How to synchronize Thread.sleep and Thread.interrupt in Java?
我想编写一个在执行可中断调用(例如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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.