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条件一直为真,死循环-
登录后可查看更多问答,登录/注册