首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中同步Thread.sleep和Thread.interrupt?

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

Stack Overflow用户
提问于 2013-04-16 08:33:21
回答 4查看 536关注 0票数 0

当线程执行可中断调用(例如Thread.sleep )时,我想编写一个中断线程的测试。

我想同步两个线程:一个线程调用Thread.sleep,另一个线程等待,直到第一个线程开始休眠,并使用Thread.interrupt中断它。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-16 09:48:55

为什么要在调用Thread.sleep之后中断?中断是在调用睡眠()之前还是之后进行的,因此无论其调用时间如何,其效果都是相同的。你想测试一下吗?然后在循环中轮询,直到线程进入等待状态:

代码语言:javascript
复制
t1.start();
while (t1.getState()!= Thread.State.TIMED_WAITING) {
   Thread.sleep(10);
}
t1.interrupt();
票数 1
EN

Stack Overflow用户

发布于 2013-04-16 08:39:26

您不能确定,因为例如,操作系统可以决定在Thread.sleep语句之前挂起第一个线程。实际上,如果您也可以在第二个线程中使用一个小睡眠以及同步,那么它应该很好:

代码语言:javascript
复制
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();
票数 3
EN

Stack Overflow用户

发布于 2013-04-16 08:42:27

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16032289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档