java - 给定两个 Java 线程,当其中一个完成时停止一个线程

标签 java concurrency runnable

我正在为这个问题寻找一个干净的设计/解决方案:我有两个线程,只要用户愿意,它们就可以运行,但最终会在用户发出停止命令时停止。但是,如果其中一个线程突然结束(例如,由于运行时异常),我想停止另一个线程。

现在两个线程都执行 Runnable(所以当我说“停止线程”时,我的意思是我在 Runnable 实例上调用了一个 stop() 方法) ,我在想的是避免使用线程(Thread 类)并使用 CompletionService 接口(interface),然后将两个 Runnable 提交给该服务的一个实例。

有了这个,我将使用 CompletionService 的方法 take(),当此方法返回时,我将停止两个 Runnable,因为我知道至少其中一个已经完成。现在,这可行,但如果可能的话,我想知道一个更简单/更好的解决方案来解决我的问题。

此外,当我们有 n 个线程并且其中一个完成后立即停止执行所有其他线程时,什么是好的解决方案?

提前致谢。

最佳答案

没有 Runnable.stop() 方法,因此显然无法启动。

不要使用 Thread.stop()!在绝大多数情况下,它从根本上来说是不安全的。

如果正确实现,这里有一些应该有效的方法。

  1. 您可以让两个线程定期检查一些公共(public)标志变量(例如,将其称为 stopNow),并安排两个线程在完成时设置它。 (标志变量需要是易变的......或适当同步。)

  2. 您可以让两个线程定期调用 Thread.isInterrupted() 方法来查看它是否已被中断。然后每个线程都需要在完成时调用另一个线程的 Thread.interrupt()


I know Runnable doesn't have that method, but my implementation of Runnable that I pass to the threads does have it, and when calling it the runner will finish the run() method (something like Corsika's code, below this answer).

据我所知,Corsika 的代码假设有一个stop() 方法在被调用时会做正确的事情。真正的问题是你是如何实现的?或者您打算如何实现?

  • 如果您已经有了一个有效的实现,那么您就有了解决问题的方法。

  • 否则,我的回答提供了两种可能的方法来实现“立即停止”功能。

I appreciate your suggestions, but I have a doubt, how does 'regularly check/call' translate into code ?

这完全取决于 Runnable.run() 方法执行的任务。它通常需要向某些循环添加检查/调用,以便测试经常发生……但不会太频繁。您还希望仅检查何时停止计算是安全的,这是您必须自己解决的另一件事。

关于java - 给定两个 Java 线程,当其中一个完成时停止一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656244/

相关文章:

java - MySQL/JDBC 问题

java - 如何检查内部类中的值?

JavaFX 8 + Spring Boot,打印 API 不显示页面设置

java - 如何使用 Java fx pdf 查看器?

JavaFX : Binding Timeline's duration to a property

go - 使用 channel 发送到多个 slice 时数据丢失

c++ - 如何在 C++ 中正确执行线程?

loops - 在嵌套 for 循环中使用并发? (蛮力)

Java 断言从可运行对象调用时不发送到控制台

JavaFX 多线程