Java Thread不会停止

时间:2012-07-23 11:56:15

标签: java multithreading jruby

我有一个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秒钟就杀掉线程。

2 个答案:

答案 0 :(得分:2)

另一种解决方案是使用内置机制来中断线程:

public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        engine.eval(myScript);
    }
}

...
th1 = new myThread();
th1.start();
try {
    Thread.sleep(5000);
    th1.interrupt();
} 

这样,不需要allDone字段,也没有失败同步的风险。

答案 1 :(得分:0)

为了使你的线程可以停止,你可能需要类似的东西。

class MyTask implements Runnable {
    public void run() {
        try {
           engine.eval(myScript);
        } catch(ThreadDeath e) {
           engine = null; // sudden death.
        }
    }    
}

您可以调用Thread.stop(),但我建议您首先阅读有关此方法的警告。


如果您希望线程运行最多5秒,最简单的解决方案是让线程自行停止。

class MyTask implements Runnable {
    public void run() {
        long start = System.currentTimeMillis();
        do {
           engine.eval(myScript);
        } while(System.currentTimeMillis() < start + 5000);
    }    
}

这假设您要重复运行engine.eval()。如果不是这种情况,您可能必须停止()线程。它被推荐是有充分理由的,但它可能是您唯一的选择。