0

我想编写一个测试来在线程执行可中断调用时中断它,例如Thread.sleep.

我想同步两个线程:一个线程调用Thread.sleep,另一个等待第一个线程开始休眠并用Thread.interrupt.

如何确保第二个线程在开始睡眠后中断第一个线程?可能吗 ?

4

4 回答 4

3

您无法确定,因为例如操作系统可能决定在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();
于 2013-04-16T08:39:26.977 回答
1

使用同步器并在从休眠线程休眠之前通知中断线程其锁定。引入一个非常小的延迟(远小于睡眠线程的睡眠时间),唤醒后在睡眠线程上发出中断。

于 2013-04-16T08:42:27.507 回答
1

为什么在调用 Thread.sleep 后要中断?中断的产生使得它的效果是相同的,不管它的调用时间是什么,它是在调用 sleep() 之前还是之后。你只想测试一下吗?然后循环轮询,直到线程进入TIMED_WAITING状态:

t1.start();
while (t1.getState()!= Thread.State.TIMED_WAITING) {
   Thread.sleep(10);
}
t1.interrupt();
于 2013-04-16T09:48:55.313 回答
1

为保证 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

于 2014-12-10T14:17:22.060 回答