首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ScheduledExecutorService重用

ScheduledExecutorService重用
EN

Stack Overflow用户
提问于 2011-05-04 15:57:36
回答 2查看 1.6K关注 0票数 0

因此,假设我有以下ScheduledExecutorService

代码语言:javascript
复制
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吗?例如,

代码语言:javascript
复制
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();        
 }

实现后一种方法的有什么好处?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-04 16:04:32

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

使用单独的执行器的好处是,常规任务是在没有干扰的情况下排定的。然而,shutdownNow()在这里几乎肯定没有达到预期的效果,一个简单的shutdown()就更合适了。

票数 1
EN

Stack Overflow用户

发布于 2011-05-04 16:03:06

如果exec被重用用于其他任务,我认为最初的部分更优雅。创建线程是一项非常重要的任务,即使是runnable也只执行一次,线程处理的一般方法是创建单个线程池并向其抛出runnable。使生活更容易,集中线程池,等等.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5886318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档