gpt4 book ai didi

java - 使用java中的 volatile boolean 标志从 HashMap 中的另一个线程停止一个线程

转载 作者:行者123 更新时间:2023-12-02 07:26:56 28 4
gpt4 key购买 nike

所以我有我的 MainThread 类负责所有其他线程。(创建、停止、监视)

 public class MainThread implements Runnable {
public static volatile boolean keepRunning = true;

public void run(){


//some code..


while(keepRunning){

//here i am creating threads for my Wired class (explaining below)
//that are stored in a hashmap

Wired wiredInterface = new Wired(s,defaultSleepTime,c,max,percent);
Thread t1 = new Thread(wiredInterface);
t1.start();
}

在我的代码深处,有一种情况我需要停止线程 t1。

我的有线类(class):

   public class Wired implements Runnable {
private static volatile boolean keepRunning = true;

public void run(){

while(keepRunning){

//code

try{
Thread.sleep(((k - i + 1)*defaultTime) - DT); //just to show that this thread sleeps periodically. doesnt affect the question
}catch(InterruptedException e){e.printStackTrace();}

}
}

在我的 Wired 类中,我有这个方法来更改 volatile 标志。

        public static void stopRunning(){
keepRunning = false;
}

我的问题是..我如何从我的 MainThread 访问我想要停止的特定线程的 stopRunning 方法? Thread.interrupt() 作为解决方案对我来说不起作用。

我看过很多涉及这个主题的类似问题,但我还没有找到适合我的情况的东西。抱歉,如果我错过了什么此代码是我的实际代码的过度简化

最佳答案

不要在这里重新发明轮子。使用 Thread.interrupt(),并正确检查 Thread.isInterrupted() 标志,和/或正确处理 InterruptedException。 IE 不要吞掉它或 printStackTrace() 它并继续。如果您收到 InterruptedException,请在 Runanble.run() 方法的边界处捕获它,并停止外循环并关闭线程。

您的方法应更改为:

public void run() {
try {
while( !Thread.currentThread().isInterrupted() ) {
doSomeThreadedThing();
}
} catch( InterruptedException e ) {
// maybe log some info you are shutting down
}
}

只要线程没有卡在某些 IO 中,正确关闭线程就非常简单。如果您有一个长时间运行的任务,您不想等待,请定期检查逻辑中的 Thread.isInterrupted() 。与使用 Thread.interrupted() 相比,您所展示的 volatile boolean 标志机制没有提供任何优势。

关于java - 使用java中的 volatile boolean 标志从 HashMap 中的另一个线程停止一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13461436/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com