gpt4 book ai didi

java - 中断Java中的循环线程

转载 作者:搜寻专家 更新时间:2023-10-31 19:41:26 25 4
gpt4 key购买 nike

我正在尝试了解线程在 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加入等待)。

我想澄清的是:

  1. 对这种任务使用中断机制可以吗? (与 volatile boolean shouldStop 相比)
  2. 这个解决方案是否正确?
  3. 我吞下 InterruptedException 是否正常?我对有人要求我的线程中断的那段代码并不感兴趣。
  4. 有没有更短的方法来解决这个问题? (要点是有“无限”循环)

编辑在捕获 InterruptedException 时添加了对 interrupt() 的调用。

最佳答案

我回答没有。 3:

基本上问题是:Interrupted 异常有什么用途?它告诉您停止阻塞(例如 sleep )并早点返回。

有两种处理 InterruptedException 的方法:

  • 重新抛出它,所以线程保持中断状态
  • 再次设置 Thread.currentThread.interrupt() 并进行清理工作。这样你就可以确定你的线程开始 hibernate 的另一个方法会再次抛出

简单地吞下一个 InterruptedException 并不是一个好主意,因为这种中断的目的是最终终止。但你只被要求打断,所以你还有时间清理。

在这种情况下,这可能是我自己的“ react 过度”,但通常此类代码要复杂得多,您怎么知道此线程中的某些后续代码不会再次调用阻塞方法?

编辑

否则我认为你做的很好。不过,对我来说有点意外,因为我从未在他自己的代码中看到任何人实际这样做。

解释原因的有趣文章可以在这里找到:http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html

关于java - 中断Java中的循环线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7025192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com