gpt4 book ai didi

java - 如何停止一个永远运行而没有任何用处的线程

转载 作者:IT老高 更新时间:2023-10-28 20:31:51 32 4
gpt4 key购买 nike

在下面的代码中,我有一个 while(true) 循环。考虑到在 try block 中有一些代码的情况,线程应该执行一些需要大约一分钟的任务,但由于一些预期的问题,它一直在运行。我们可以停止那个线程吗?


public class thread1 implements Runnable {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
thread1 t1 = new thread1();
t1.run();

}

@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try{
Thread.sleep(10);

}
catch(Exception e){
e.printStackTrace();
}
}
}
}

最佳答案

首先,你没有在这里启动任何线程!您应该创建一个新线程并将您的混淆命名 thread1 Runnable 传递给它:

thread1 t1 = new thread1();
final Thread thread = new Thread(t1);
thread.start();

现在,当你真的有一个线程时,有一个内置功能可以中断正在运行的线程,称为... interrupt():

thread.interrupt();

然而,单独设置这个标志没有任何作用,你必须在你的运行线程中处理这个:

while(!Thread.currentThread().isInterrupted()){
try{
Thread.sleep(10);
}
catch(InterruptedException e){
Thread.currentThread().interrupt();
break; //optional, since the while loop conditional should detect the interrupted state
}
catch(Exception e){
e.printStackTrace();
}

需要注意两点:while 循环现在将在线程 isInterrupted() 时结束。但是如果线程在 sleep 期间被中断,JVM 非常友好,它会通过从 sleep() 中抛出 InterruptedException 来通知您。捕获它并打破你的循环。就是这样!


至于其他建议:

Deprecated. This method is inherently unsafe[...]

  • 添加您自己的标志并密切关注它很好(只要记住使用 AtomicBooleanvolatile!),但如果 JDK 已经为您提供了内置-in 像这样的标志?额外的好处是中断 sleeps,使线程中断更具响应性。

关于java - 如何停止一个永远运行而没有任何用处的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6410721/

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