简体   繁体   中英

Java Thread won't stop

I have a JRuby engine which evaluates some scripts and I want to close the thread if it takes more than 5 seconds. I tried something like this:

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");

I also tried to kill the thread with th1.stop() or th1.interrupt() but the value retured by th1.isAlive() method is always true .

What can I do? I want to add that myScript could be "while(1) do; end" and I cannot wait until it's completed. So I want to prevent scripts like that and kill the thread if it takes more than 5 seconds.

Another solution would be to use the built-in mechanism to interrupt threads:

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

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

This way, no need for an allDone field, and no risk in failing to synchronize.

To make your Thread stoppable you might want something like.

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

You can call Thread.stop(), but I suggest you read the warnings on this method first.


If you want a thread to run for up to 5 seconds, the simplest solution is for the thread to stop itself.

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

This assumes you want to run engine.eval() repeatedly. If this is not the case you may have to stop() the thread. It is deprecated for a good reason but it might be your only option.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM