Thread.interrupt()
:
中断该线程。除非当前线程正在中断自身(这始终是允许的),否则将调用该线程的 checkAccess 方法,这可能会导致抛出 SecurityException。
如果此线程在调用Object 类的 wait()、wait(long) 或 wait(long, int) 方法或 join()、join(long)、join(long, int) 时被阻止、 sleep(long) 或 sleep(long, int) 等此类方法,则其中断状态将被清除,并会收到 InterruptedException。
如果该线程在 InterruptibleChannel 上的I/O 操作中被阻塞,则该通道将被关闭,该线程的中断状态将被设置,并且该线程将收到 ClosedByInterruptException。
如果该线程在选择器中被阻塞,则该线程的中断状态将被设置,并且它将立即从选择操作中返回,可能返回一个非零值,就像调用选择器的唤醒方法一样。
如果前面的条件都不成立,则该线程的中断状态将被设置。
中断不活动的线程不需要产生任何效果。
假设我们有这样的代码:
AtomicBoolean thread1Done = new AtomicBoolean(false);
//write in file
Thread thread1 = new Thread(() -> {
try(var writer = Files.newBufferedWriter(Paths.get("foo.txt"))){
for(int i = 0; i < 10000; i++){
writer.write(i);
writer.newLine();
}
}catch(Exception e){ e.printStackTrace(); }
thread1Done.set(true);
});
//interrupt thread1
Thread thread2 = new Thread(() -> {
while(!thread1Done.get()){
thread1.interrupt();
}
});
thread2.start();
thread1.start();
thread1由于thread1.interrupt()from ,从不在文件中写入任何内容thread2。
java.nio.channels.ClosedByInterruptException它总是以at结尾writer.newLine();并且foo.txt为空。
有没有办法只打断wait, join and sleep,而忽略其余的?
我在 Windows10 x64 上使用 JDK10 运行我的代码。
慕森卡
侃侃无极
相关分类