2 回答
TA贡献1806条经验 获得超8个赞
如果您想要的是仅在线程被 wait、join 和 sleep 调用阻塞而不是 IO 操作时中断线程,您可以在调用中断方法之前简单地检查线程状态。您可以参考以下链接中的 api 和不同状态。
https://docs.oracle.com/javase/10/docs/api/java/lang/Thread.State.html
示例代码可能如下所示。
while ( ( thread1.getState() == Thread.State.WAITING || thread1.getState() == Thread.State.TIMED_WAITING ) && !thread1Done.get()) { thread1.interrupt(); }
TA贡献2051条经验 获得超10个赞
按照目前的情况,您的代码运行完成将Thread 110k 行写入输出文本文件,换句话说是中断,但其中Thread 2没有可中断的语句。这是因为(我想)使用不间断 I/O打开文件。Thread 1BufferedWriter
如果您希望长循环是Thread 1可中断的,您可以在长时间运行的循环中添加以下检查:
for(int i = 0; i < 10000; i++){
if (Thread.currentThread().isInterrupted()) { //interruptible loop
break;
}
writer.write(i);
writer.newLine();
System.out.println(i);
}
然后,通过将中断延迟Thread 210 毫秒,我发现只有几百个条目被写入文件(没有延迟,它会立即中断)。
当我切换Thread 1为使用可中断通道
时(按原样FileChannel extends AbstractInterruptibleChannel):
Thread thread1 = new Thread(() -> {
FileChannel fc = null;
try (
FileChannel fc = FileChannel.open(Paths.get("foo.txt"),
StandardOpenOption.CREATE, StandardOpenOption.WRITE);
)
{
fc = FileChannel.open(Paths.get("foo.txt"),
StandardOpenOption.CREATE, StandardOpenOption.WRITE
);
for(int i = 0; i < 10000; i++){
fc.write(ByteBuffer.wrap(("" + i).getBytes()));
fc.write(ByteBuffer.wrap(("\n").getBytes()));
System.out.println(i);
}
} catch (Exception e) {
e.printStackTrace();
}
}
...我确实得到了很好的可中断文件写入线程。
添加回答
举报