【发布时间】:2019-12-12 17:33:27
【问题描述】:
我有一个每 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 "
}
}
}
【问题讨论】:
-
为什么要按名字杀掉它?为什么不保留对线程的引用,并通过引用(以某种方式)杀死它?
-
也很好...我只是想以某种方式杀死它。建议如何采纳代码?
-
另外,你是如何杀死线程的?如果您使用的是
Thread#stop(),那是不安全且已弃用的。相反,我会向线程发送一个中断信号,并让它们定期检查它。 -
"这个线程偶尔会卡住" 为什么不直接解决这个潜在问题...?
-
可以完全中断
checkDBupdates操作吗?您可以尝试拨打loopthread.interrupt()。线程会死吗?
标签: java multithreading