请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

sleep的清除标记位

public class StopThread implements Runnable{
@Override
public void run() {

    while (!Thread.currentThread().isInterrupted()) {
        try {
            tsl();
            System.out.println("tsl");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

private void tsl() throws InterruptedException{
    Thread.sleep(1000);
}

public static void main(String[] args) throws InterruptedException {
    Thread thread = new Thread(new StopThread());//创建
    thread.start();//启动
    Thread.sleep(2000);//主线程睡一秒钟,在执行下面的代码
    thread.interrupt();//中断也没用,要被中断的线程配合才行

}

}
//可以正常响应中断 标记位并没有被清除
底层的tsl()方法我选择向上层抛出异常,由调用方去处理,因为上层调用时run方法,只能自己捕获,不能在方法签名中声明抛出,然而sleep方法不是会清除标记位吗,我也没有catch块中恢复,为啥可以正常响应中断了,还是在run方法中catch会自动把中断信号给恢复?

public class StopThread implements Runnable{
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
tsl();
System.out.println(“tsl”);
}
}

private void tsl() {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) throws InterruptedException {
    Thread thread = new Thread(new StopThread());//创建
    thread.start();//启动
    Thread.sleep(2000);//主线程睡一秒钟,在执行下面的代码
    thread.interrupt();//中断也没用,要被中断的线程配合才行

}

}
//老师这个我可以理解,因为我屏蔽了中断,既没有在方法上抛出也没有在catch块中恢复中断(sleep方法清除了标记位),所以while条件一直为真,死循环-

正在回答 回答被采纳积分+3

1回答

悟空 2023-05-28 23:08:10

主线程休眠时间太长了,子线程已经执行完了。可以改一下试一下。sleep会清除中断标记。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信