我试图了解线程在 Java 中是如何工作的,目前正在研究如何实现可以取消的循环线程。这是代码:
public static void main(String[] args) throws Exception {
Thread t = new Thread() {
@Override
public void run() {
System.out.println("THREAD: started");
try {
while(!isInterrupted()) {
System.out.printf("THREAD: working...\n");
Thread.sleep(100);
}
} catch(InterruptedException e) {
// we're interrupted on Thread.sleep(), ok
// EDIT
interrupt();
} finally {
// we've either finished normally
// or got an InterruptedException on call to Thread.sleep()
// or finished because of isInterrupted() flag
// clean-up and we're done
System.out.println("THREAD: done");
}
}
};
t.start();
Thread.sleep(500);
System.out.println("CALLER: asking to stop");
t.interrupt();
t.join();
System.out.println("CALLER: thread finished");
}
我创建的线程迟早会被中断。所以,我检查 isInterrupted() 标志来决定我是否需要继续,并InterruptedException
在我处于一种等待操作(sleep
, join
, wait
)时捕获处理案例。
我想澄清的事情是:
- 这种任务可以使用中断机制吗?(与拥有相比
volatile boolean shouldStop
) - 这个解决方案正确吗?
- 我吞下 InterruptedException 是否正常?我真的不感兴趣有人要求我的线程中断的代码是什么。
- 有没有更短的方法来解决这个问题?(重点是有“无限”循环)
编辑interrupt()
在 catch 中
添加了对InterruptedException
.