ScheduledExecutorService повторное использование - PullRequest
0 голосов
/ 04 мая 2011

Итак, допустим, у меня есть следующее 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 ]

1 голос
/ 04 мая 2011

Если обычные задачи и одноразовые задачи каким-то образом связаны и , планирование регулярных задач не настолько критично, чтобы (возможная) задержка их выполнения была проблемой, тогда япросто выполнить одноразовое задание на одном и том же исполнителе.

Преимущество использования отдельного исполнителя заключается в том, что обычные задания планируются без помех.Однако shutdownNow() будет почти наверняка не иметь здесь желаемого эффекта, простой shutdown() будет более подходящим.

1 голос
/ 04 мая 2011

Если exec повторно используется для других задач, начальная часть кажется мне более элегантной.Создание потока - нетривиальная задача, даже исполняемый файл выполняется только один раз, общий подход к созданию потоков - создание пула с одним потоком и создание в них запускаемых объектов.Облегчает жизнь, централизует пулы потоков и т. Д. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...