在Java中使用线程ID终止线程

13

我想使用线程 ID 终止线程。

使用下面的语句可以获取线程,我将这个线程 ID 存储在 Hashtable 中。

long threadId = Thread.currentThread().getId(); 

我该如何实现它?


1
获取线程的方法在这里解释:https://dev59.com/bHXYa4cB1Zd3GeqP8qjX#18224488 然后中断它。 - René Link
1
只需保留自定义线程的引用而不是ID,并使用Thread.interrupt()终止线程,或为每个线程ID维护一个Map<String,Thread> - Braj
3个回答

22
你可以这样做,
//Give you set of Threads
Set<Thread> setOfThread = Thread.getAllStackTraces().keySet();

//Iterate over set to find yours
for(Thread thread : setOfThread){
    if(thread.getId()==yourThread.getId()){
        thread.interrupt();
    }
}

1
第一个真正的回答,点赞!顺便说一下,在这种情况下不需要将“Set”转换为数组,您可以直接在“setOfThread”上进行迭代。 - Dmitry Ginzburg
6
Java 8:setOfThread.stream().findAny(t -> t.getId() == id).ifPresent(Thread::interrupt);该行代码会在一个线程集合 setOfThread 中查找一个线程 t,如果该线程的 ID 等于变量 id,则会调用其 interrupt() 方法进行中断。 - Marko Topolnik

0

你可以使用此帖子中的答案通过其ID获取线程,然后中断它,但是,如评论中所述,你不应该这样做。相反,使用线程对象引用并直接处理线程。


0
我认为一个好的方法是创建一个实现java.lang.Runnable接口并具有stop()方法的类。代码如下:
public class Stoppable implements Runnable

{ private boolean stopRequested = false;

} 私有布尔型变量stopRequested=false;
@Override
public void run()
{
    // Thread code
    if (stopRequested)
    {
        // Perform any tidy up activities and return from the run method

        return;
    }
}

public void stop()
{
    stopRequested = true;
}

}

你可以使用Java内置中断方法thread.interrupt()来实现。然后在你的runnable中检查它,使用Thread.currentThread().isInterrupted()。但是我一直更喜欢使用单独的变量和代码,这样可以给我更多的控制。
如果你使用的是Java 7以上版本,则可以尝试使用executors http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html。它们提供了很多有用的功能,如返回类型和异常处理,这在传统线程方法中一直是有点麻烦的。

同步不是更具逻辑特定要求吗?我的意思是,由于每个可运行对象都是在自己的线程上的单独实例,所以您实际上不需要使用同步。您对同步有什么想法? - Arun Ramakrishnan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接