因此,假设我有以下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();
}实现后一种方法的有什么好处?
发布于 2011-05-04 16:04:32
如果常规任务和一次性任务在某种程度上是相关的,而常规任务的调度并不是执行中(可能的)延迟是一个问题的关键,那么我只需要在同一个执行器上执行一次任务。
使用单独的执行器的好处是,常规任务是在没有干扰的情况下排定的。然而,shutdownNow()在这里几乎肯定没有达到预期的效果,一个简单的shutdown()就更合适了。
发布于 2011-05-04 16:03:06
如果exec被重用用于其他任务,我认为最初的部分更优雅。创建线程是一项非常重要的任务,即使是runnable也只执行一次,线程处理的一般方法是创建单个线程池并向其抛出runnable。使生活更容易,集中线程池,等等.
https://stackoverflow.com/questions/5886318
复制相似问题