基于线程ID的中断线程

时间:2014-09-04 01:27:29

标签: java multithreading

  

当您仅获得线程ID时,如何中断或停止线程?比如,线程ID的格式很长。

2 个答案:

答案 0 :(得分:0)

从Thread.enumerate和Thread.activeCount

开始
Thread findThreadById(long id) {
    Thread [] threads = new Thread[Thread.activeCount() * 2];
    int count = Thread.enumerate(threads);
    for (int i = 0; i < count; i++) {
        if (threads[i].getId() == id) {
           return threads[i];
        }
    }
    return null;
}

上面的Thread.activeCount()加倍是为了捕获在调用Thread.activeCount和Thread.enumerate之间线程数增加的情况。它可能需要也可能不需要,但除了几个字节的内存外,不应该花费太多。

所以不是你有你想要的Thread实例,只需要调用Thread.interrupt。

注意 - 线程的硬停止和终止是不好的形式。根据某种条件(由另一个线程设置)找到使线程自行退出的方法要好得多。

答案 1 :(得分:0)

通过线程的合作,使用它提供的任何方法。如果没有线程的合作,你就不能。在没有合作的情况下中断或停止线程会破坏该过程。 (假设线程持有另一个线程需要的锁,或者打破了它即将恢复的不变量。)

这个问题往往来自于思考线程和流程的糟糕方式。线程合作以完成工作。任何时候你觉得你需要从外部“到达”一个线程来“做”它做正确的事情,这应该是一个警告,你首先编写错误的线程。编写线程来做什么,只做你希望它做什么。然后你不必打断或停止它。

如果由于某种原因不可能,那么在该线程的代码中设计中断或停止它的能力。