последовательная обработка событий через executorservice - PullRequest
0 голосов
/ 05 ноября 2010

У меня есть очередь событий для обработки. Поток добавляет события в очередь.
Я создал выполняемую задачу, которая в методе run делает все необходимое для обработки события.
Я объявил Executors.newCachedThreadPool(); и я execute каждая задача.

        public class EventHandler {

            private static final ExecutorService handlers = Executors.newCachedThreadPool();

            public void handleNextEvent(AnEvent event){

                  handlers.execute(new Task(evt)); 

            }   


        public class Task implements Runnable{

        @Override
            public void run() {
            //Event processing
            }
        }

public AnotherClass{    
    public void passEvent(AnEvent evt)//This is called by another thread
    {
      EventHandler.handleNextEvent(evt);

    }
}

Моя проблема в том, что если я вызову execute исполнителя, мой код получит следующее событие и выполнит следующий запускаемый через исполнителя. Моя цель - обработать следующее событие из очереди только после завершения предыдущего задания.
Откуда мне знать, что предыдущая задача завершена или нет, чтобы я знал, что могу снова вызвать handleNextEvent?
Является ли наличие какого-либо поля состояния, обновленного Задачей, хорошей идеей?

Спасибо

Ответы [ 2 ]

6 голосов
/ 05 ноября 2010

Executors.newCachedThreadPool() создаст новые темы по запросу, так что это не то, что вы хотите.Вам нужно что-то вроде Executors.newSingleThreadExecutor(), которое будет обрабатывать события по одному и ставить в очередь остальные.

См. javadoc :

СоздаетИсполнитель, который использует один рабочий поток, работающий из неограниченной очереди.(Тем не менее, обратите внимание, что если этот единственный поток завершается из-за сбоя во время выполнения до завершения работы, то при необходимости для выполнения последующих задач его место занимает новый.) Задачи гарантированно выполняются последовательно, и не более одной задачи будет активнойв любой момент времени.

0 голосов
/ 05 ноября 2010

Я думаю Executors.newSingleThreadExecutor() и метод submit() - это решение вашей проблемы: http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorService.html

...