我有一个ScheduledThreadPoolExecutor,它有一个线程并且每30秒运行一次。
现在,如果当前正在执行的线程抛出一些异常,那么我需要确保下一个线程不运行并且ScheduledThreadPoolExecutor已关闭。
我如何实现这一目标?
答案 0 :(得分:1)
作为一种简洁的方法,您只需使用静态访问类来设置/检查执行可用性。
import java.util.concurrent.atomic.AtomicBoolean;
class ThreadManager
{
private static AtomicBoolean shouldStop = new AtomicBoolean(false);
public static void setExceptionThrown(boolean val)
{
shouldStop.set(val);
}
public boolean shouldExecuteTask()
{
return !shouldStop.get();
}
}
一个自定义的可运行实现,允许您检查执行任务的可能性
abstract class ModdedRunnable implements Runnable
{
@Override
public void run()
{
if(ThreadManager.shouldExecuteTask())
{
try
{
runImpl();
}
catch(Exception t)
{
ThreadManager.setExceptionThrown(true);
}
}
}
public abstract void runImpl() throws Exception;
}
答案 1 :(得分:1)
<强> shutdown()方法强>
启动有序关闭,其中先前提交的任务已执行,但不会接受任何新任务。如果已经关闭,调用没有其他影响。 此方法不会等待先前提交的任务完成执行。 使用awaitTermination执行此操作。
<强>执行shutdownNow()强>
尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。 此方法不等待主动执行任务终止。 使用awaitTermination执行此操作。
除了尽力尝试停止处理主动执行任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何无法响应中断的任务都可能永远不会终止。
有关工作代码的详细信息,请参阅这些帖子。