所以,假设我有以下内容
ScheduledExecutorService
:
public class Foo
{
private ScheduledExecutorService exec;
public Foo()
{
exec = Executors.newScheduledThreadPool(NUM_OF_TASKS);
}
public void executeOnce()
{
exec.schedule(new Runnable(){
@Override
public void run()
{
Foo.this.doSomething();
}}, DELAY, TimeUnit.MILLISECONDS);
}
}
现在,
exec
用于执行周期性任务(例如目录轮询等)。但是,有一个任务(即 executeOnce
)会执行 一次,但需要延迟。所以,我选择使用exec
来执行这个任务,但是这样的设计好吗?相反,我应该创建一个 newSingleThreadExecutor
,然后调用 shutdown
吗?例如,
public void executeOnce()
{
// Execute task and wait 'til completion
ExecutorService exec = Executors.newSingleThreadExecutor();
try {
exec.submit(new Runnable(){
@Override
public void run()
{
try
{
Thread.sleep(DELAY);
} catch (InterruptedException e) {
}
Foo.this.doSomething()
}
}).get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {
}
// Shutdown executor service
exec.shutdownNow();
}
实施后者有什么好处吗?
并且常规任务的调度并不那么重要,以至于它们的执行(可能的)延迟是一个问题,那么我只需执行一个-同一执行器上的时间任务。
使用单独的执行器的优点是可以不受干扰地安排常规任务。然而shutdownNow()
在这里几乎肯定不会达到预期的效果,简单的
shutdown()
会更合适。