【问题标题】:Terminate a thread by Thread name or ThreadGroup name - Java [closed]通过线程名称或线程组名称终止线程 - Java [关闭]
【发布时间】:2013-03-20 16:12:59
【问题描述】:

我们如何通过名称终止 ThreadThreadGroup 实例?

【问题讨论】:

  • 你试过什么?你做了什么研究? SO 不是你的研究助理。
  • 所以我们为完成这项任务所做的一些努力..
  • 就我而言,我在服务器中运行的线程数是动态的。所以我不能保留这些参考资料。当响应服务时,所有线程钩子都将消失。我认为使用共享变量或 volatile 变量来发出信号是行不通的。
  • 是什么让你这么想?
  • 我可以在我的会话中获得那些Thread 引用。如果是这样,它也会分配一些内存。如果我可以使用ThreadGroup,并且如果我可以停止ThreadGroup 下的所有线程,那将会容易得多。但是 ThreadGroup 不推荐使用 stop()、suspend() 等方法。

标签: java multithreading


【解决方案1】:

类似的东西

    Thread[] a = new Thread[1000];
    int n = Thread.enumerate(a);
    for (int i = 0; i < n; i++) {
        if (a[i].getName().equals(name)) {
            a[i].interrupt();
            break;
        }
    }

虽然 interrupt() 不会终止线程,但 stop() 会(尽管已弃用)

【讨论】:

  • 重要的是要知道中断线程并不会“终止”它。见:stackoverflow.com/questions/10632451/…
  • @Evgeniy:很有帮助。谢谢!
  • 中断是最好的方法,但执行代码应该正确支持它。
【解决方案2】:

这取决于您说“终止”时的意思。

但第一个提示是,您必须获取要终止的所有线程的列表。使用Thread.getThreads() 来执行此操作。如果需要,您可以按组过滤线程。

现在,如何停止线程?有两种方式。

  1. 调用stop()方法。它已被弃用,你不应该使用它,因为它可能会导致系统进入不一致的状态。但是,如果您真的想要...仍然支持此方法。
  2. 每个线程都应该支持关闭机制,即一种“协议”,可用于通知线程退出其run() 方法。如果所有线程都是你的,你可以让它们实现你自己的接口(例如Terminatable),方法是terminate(),这将改变标志的值并导致线程退出。在这种情况下,终止线程的代码应该遍历线程,检查线程应该被终止并且它实现了接口Terminatable,转换为它并调用它的terminate() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多