恢复中断的线程



我想恢复中断线程的工作,请让我知道一些可能的解决方案。

class RunnableDemo implements Runnable 
{
   public void run() 
   {
    while(thread.isInterrupted())
        {
        try{}
                catch(Exception e){ //exception caught}
        }
   }
}

如果捕获异常,线程会中断,但即使捕获异常,我也希望线程继续工作,所以请向我建议一些方法来解决此问题。

提前致谢

线程

中断是您在编写线程时选择遵守的事情。因此,如果您不希望线程被中断,请不要检查中断状态并继续。

唯一需要 try/catch 语句(关于线程中断)的情况是在调用抛出InterruptedException的阻塞方法时。然后,您需要避免让该异常停止线程的工作。

答案是肯定的。。。您应该考虑一下这是否是一种合适的行为方式。线程中断是一件有用的事情,选择不遵守它可能会让代码用户感到烦恼。

我编写了一个可重用的代码来获取此功能,线程可以在其中暂停和恢复。请在下面找到代码。您可以扩展PausableTask并覆盖task()方法:

public abstract class PausableTask implements  Runnable{
    private ExecutorService executor = Executors.newSingleThreadExecutor();
    private Future<?> publisher;
    protected volatile int counter;
    private void someJob() {
        System.out.println("Job Done :- " + counter);
    }
    abstract void task();
    @Override
    public void run() {
        while(!Thread.currentThread().interrupted()){
            task();
        }
    }
    public void start(){
        publisher = executor.submit(this);
    }
    public void pause() {
        publisher.cancel(true);
    }
    public void resume() {
        start();
    }
    public void stop() {
        executor.shutdownNow();
    }
}

希望这有帮助。有关更多详细信息,请查看此链接或在评论部分给我喊叫。http://handling-thread.blogspot.co.uk/2012/05/pause-and-resume-thread.html

只有当有人调用该线程的 interrupt() 方法时,线程才会中断,而不是因为在你思考时运行线程时抛出了其他一些随机异常。

当线程的 interrupted() 方法被调用时,如果线程处于阻塞操作的中间(例如。IO 读取)。

当抛出 InterruptedException 时,你应该知道中断状态被清除了,所以下次你在线程中调用 isInterrupted() 时会给你 false(即使你只是处理了 InterruptedException)

在编写线程代码时请记住这一点。如果你不明白我在说什么,停止编码多线程,去读一些关于Java并发的书。

一个警告:如果你的线程在调用第三方库时处理 InterruptedException,那么你不一定知道库对它的反应(即,当你的程序继续使用它们有意义时,它是否让库对象处于某种状态?

一些开发人员

(包括一些库开发人员)错误地认为中断意味着"关闭程序",他们所关心的只是关闭文件等;而不是库是否可以继续使用。

试试看,但是如果你正在编写代码来控制航天器或核反应堆或其他东西,那么你可能需要做一些额外的工作来真正找出库的作用。

正如其他人已经说过的,通常中断是取消任务的正确方法。如果您确实需要实现不可取消的任务,至少请确保在完成不可中断工作后恢复线程的中断状态:

public void run() {
    boolean interrupted = false;
    try {
        while (true) {
            try {
                callInterruptibleMethod();
            } catch (InterruptedException ex) {
                interrupted = true;
                // fall through and retry
            }
        }
    } finally {
        if (interrupted) {
            // restore interruption state
            Thread.currentThread().interrupt();
        }
    }
}

(摘自《Java并发实践》一书)

最新更新