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();
}
}
}