我有一个评估某些脚本的JRuby引擎,如果要花费5秒钟以上的时间,我想关闭线程。
我尝试过这样的事情:
class myThread extends Thread{
boolean allDone = false;
public void threadDone() {
allDone = true;
}
public void run() {
while(true) {
engine.eval(myScript);
if(allDone)
return;
}
}
(...)
th1 = new myThread();
th1.start();
try {
Thread.sleep(5000);
if(th1.isAlive())
th1.threadDone();
} catch(InterruptedException e) {}
if(th1.isAlive())
System.out.println("Still alive");
我也尝试使用
th1.stop()
或th1.interrupt()
杀死线程,但是th1.isAlive()
方法获得的值始终是true
。我能做什么?
我想补充一点,myScript可以是“ while(1)do; end”,我等不及要等到它完成。因此,我想阻止类似的脚本,并且如果花费5秒钟以上的时间来杀死该线程。
最佳答案
另一种解决方案是使用内置机制来中断线程:
public void run() {
while (!Thread.currentThread().isInterrupted()) {
engine.eval(myScript);
}
}
...
th1 = new myThread();
th1.start();
try {
Thread.sleep(5000);
th1.interrupt();
}
这样,不需要
allDone
字段,也没有失败同步的风险。