繁体   English   中英

如何在Java中同步Thread.sleep和Thread.interrupt?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM