我有一个评估某些脚本的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字段,也没有失败同步的风险。

10-04 20:22