我有一个每15秒运行一次的脚本,它每次都会创建一个新线程。有时这个线程会卡住,阻塞我的程序的同步进程。现在,如果线程被阻塞了20个循环,我想用一个特定的名称杀死这个进程。下面是我的代码:
public void actionPerformed(ActionEvent e) {
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat ("dd-MM-yyyy HH:mm:ss");
System.out.println(ft.format(dNow));
ThreadGroup currentGroup = Thread.currentThread().getThreadGroup();
int noThreads = currentGroup.activeCount();
Thread[] lstThreads = new Thread[noThreads];
currentGroup.enumerate(lstThreads);
boolean loopthreadfound = false;
for (int i = 0; i < noThreads; i++){
try{
if (lstThreads[i].getName() == "loopthread"){loopthreadfound = true;}
}catch(Exception e1){System.out.println(e1);}
}
if (loopthreadfound == false){
loopthreadcounter = 0;
//Starten in nieuwe thread
Thread loopthread = new Thread() {
public void run() {
try {
checkonoffline();
checkDBupdates();
} catch (JSONException | SQLException | IOException e1) {
System.out.println(e1);
}
}
};
loopthread.setName("loopthread");
loopthread.start();
}else{
loopthreadcounter++;
System.out.println("Loopthread already running... counter: " + loopthreadcounter);
if (loopthreadcounter > 20){
// HERE I WANT TO KILL THE THREAD "loopthread "
}
}
}发布于 2019-12-13 02:05:30
通常,线程名称不是唯一的。如果您正在将一个String与一个Thread相关联,并且该字符串标识了您要停止的线程,请自己跟踪它,而不是将其视为线程名称。
也就是说,创建一个Map<String, Thread>。稍后,您可以通过"name“从map中获取正确的线程并终止它。
请注意,stop()已弃用。您应该找到正确的方法来终止、中断或终止被阻塞的操作。
发布于 2019-12-13 02:12:13
在java中你不能杀死线程。
因此,让我们退后一步:你有一个问题,你想:我知道!我会杀了这条线..。我该怎么做?
错误的策略。让线程结束的最常见的“外部”方法(如在中,而不是从线程本身的代码内部)就是告诉线程进行自我清理。不管它会不会,那是...在那里你写一些代码,这样它就会发生。
对于您的情况:假设某些I/O操作被卡住了。对于大多数I/O和大多数OSes,您可以中断线程;这会导致发生IOException,从而“解开”任何被卡住的东西。我将向您展示一个示例。我将使用Thread.sleep而不是I/O操作,因为java规范保证了可中断性:
在线程的代码中:
public void run() {
while (!Thread.interrupted()) {
doExpensiveOp();
try {
// sleep a long time
Thread.sleep(1000000);
} catch (InterruptedException e) {
return;
}
}
}在控制代码中:
Thread x = ... that thread.;
x.interrupt();中断方法将“提升中断标志”,仅此而已。然而,许多java核心库调用都会与之交互。例如,所有被定义为“抛出InterruptedException”的方法,如果它们在线程中断时处于休眠状态,那么它们将立即退出,如果标志为up,而您调用了其中一个方法,它们根本不会运行,它们会立即退出并返回异常。我们还在while循环中检查标志的状态。所以,如果我们在sleep()操作中,如果你中断上面的线程代码,它肯定会退出。如果线程当前处于开销较大的op部分,则会发生以下三种情况之一:
interrupt()方法不会强制关闭或停止任何东西,在Thread上也没有任何方法可以用来强制停止它。没有一个内置代码( java.*包中的东西)会做这样的事情;它们总是忽略它,抛出指定要这样做的InterruptedException,或者抛出相关的异常;几乎总是IOException.https://stackoverflow.com/questions/59309998
复制相似问题