ScheduledExecutorService重用

时间:2011-05-04 15:57:36

标签: java executorservice

所以,假设我有以下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();        
 }

是否有好处实施后者?

2 个答案:

答案 0 :(得分:1)

如果exec被重复用于其他任务,那么最初的作品会让我更加优雅。创建线程是一项非常重要的任务,即使runnable只执行一次,线程的一般方法是创建单个线程池并向它们抛出runnable。使生活更轻松,集中线程池等......

答案 1 :(得分:1)

如果常规任务和一次性任务以某种方式相关,那么常规任务的调度并不像执行中的(可能的)延迟是一个问题那么关键,那么我只是在同一个执行器上执行一次性任务。

使用单独的执行程序的好处是可以安排常规任务而不受干扰。但是shutdownNow() 几乎可以肯定在这里没有达到预期的效果,简单的shutdown()会更合适。