【问题标题】:Multithreading - Killing a Thread and all its child processes多线程 - 杀死一个线程及其所有子进程
【发布时间】:2012-03-22 23:39:44
【问题描述】:

我正在开发一个分析应用程序。在 Java 中。在顶部我有一个 GUI,它有 START 和 STOP Buttons.On 点击 Start 我创建了一个 Thread 里面的 RUN 方法我调用了一个 API 方法,它在内部创建了一个 Thread.i.e.

点击“开始”----->产生一个线程---->在这个线程的 RUN 方法中,我使用了一个 API cal,它在内部创建了一个线程......

现在,我想要的是,当我单击 STOP GUI 按钮时,API 调用创建的内部线程也应该死掉..

我怎样才能做到这一点??

谢谢

【问题讨论】:

  • API 是否提供任何方法来杀死/停止线程?
  • 是的,我有一个针对所有内部线程的显式线程关闭方法:)

标签: java multithreading


【解决方案1】:

您必须为线程类实现一些逻辑。首先,他们需要一些“杀戮开关”——你不能(不应该!!)从外面阻止他们。我们通常在线程实例上定义并设置一个标志,以便它知道何时必须终止。

那么,我们没有线程“层次结构”。线程实例将需要其自己的子线程列表,如果它(父)收到停止信号,则必须向其子线程发送相同的信号。

public abstract class MyThread extends Thread {

   private List<MyThread> children = new ArrayList<MyThread>();
   private boolean stopNow = false;  // <- this is the stop flag

   public void stopNow() {
     for (MyThread thread:children) {
       thread.stopNow();
     }
     stopNow = true;
   }
 }

(这实际上不会使线程停止,我们必须在run 方法中“监视”stopNow 标志)。

【讨论】:

  • 但我的问题是我无法获得对该线程的引用,它是由 API 调用在内部生成的。
  • 线程是做什么的,API调用中传递了什么?也许您可以将导致“隐藏”内部线程的内容更改为异常/失败。
  • 您只需传递起始信息。一次,然后创建一个线程,它自己进行..我需要大量的信息。因此我需要在开始时传递一个合法的输入。
  • 根据 Martin 的评论 - 线程是否使用任何您可以更改以导致其失败的资源(db?文件?),而不是您在开始时传入的资源?
  • 该线程使用来自世界各地的实时推文...关闭互联网连接无济于事,因为它会再次记录错误,说没有互联网连接,我不想要...
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多