Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 恢复中断线程_Java_Multithreading - Fatal编程技术网

Java 恢复中断线程

Java 恢复中断线程,java,multithreading,Java,Multithreading,我想恢复中断线程的工作,请让我知道一些可能的解决方案 class RunnableDemo implements Runnable { public void run() { while(thread.isInterrupted()) { try{} catch(Exception e){ //exception caught} } } } 若捕捉到异常,线程将被中断,但即使捕捉

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

class RunnableDemo implements Runnable 
{

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

   }

}
若捕捉到异常,线程将被中断,但即使捕捉到异常,我希望线程继续工作,所以请建议我一些克服此问题的方法


提前感谢

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

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


当然。。。你应该考虑一下这是否是一种合适的行为方式。线程中断是一件很有帮助的事情,选择不遵守它可能会让代码用户感到恼火。

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

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


当然。。。你应该考虑一下这是否是一种合适的行为方式。线程中断是一件很有帮助的事情,选择不遵守它可能会让代码的用户感到恼火。

只有当有人调用该线程的interrupt()方法时,线程才会被中断,而不是因为在运行线程时如你所想引发了其他一些随机异常


当线程中断()方法被调用时,如果线程处于阻塞操作的中间(如IO Read),则中断线程将被抛出到线程中。 当抛出InterruptedException时,您应该知道interrupted状态已清除,因此下次在线程中调用isInterrupted()时,将给出false(即使您只是调用InterruptedException)


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

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


当线程中断()方法被调用时,如果线程处于阻塞操作的中间(如IO Read),则中断线程将被抛出到线程中。 当抛出InterruptedException时,您应该知道interrupted状态已清除,因此下次在线程中调用isInterrupted()时,将给出false(即使您只是调用InterruptedException)


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

一个警告:如果你的线程在调用第三方库时处理了中断异常,那么你不一定知道库对它有何反应(即,当您的程序继续使用库对象时,它是否使库对象处于合理的状态?)

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


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

一个警告:如果您的线程在调用第三方库时处理中断异常,那么您不一定知道库是如何运行的对其采取行动(即,当程序继续使用库对象时,它是否使库对象处于合理状态?)

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


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

我已经编写了一个可重用的代码来获取此功能,线程可以暂停和恢复。请查找下面的代码。你可以扩展PausableTasknd override task()方法:

公共抽象类PausableTask实现Runnable{
私有ExecutorService executor=Executors.newSingleThreadExecutor();
私人未来出版商;
受保护的易失性int计数器;
私人工作{
System.out.println(“作业完成:-”+计数器);
}
抽象空任务();
@凌驾
公开募捐{
而(!Thread.currentThread().interrupted()){
任务();
}
}
公开作废开始(){
发布者=执行者。提交(此);
}
公共空间暂停(){
publisher.cancel(true);
}
公众简历(){
start();
}
公共停车场(){
执行者。关机现在();
}
}
希望这有帮助。更多详情请查看此链接或在评论部分给我留言。

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

公共抽象类PausableTask实现Runnable{
私有ExecutorService executor=Executors.newSingleThreadExecutor();
未来私人出版商
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();
    }
}
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();
        }
    }
}