2010-11-05 49 views
0

我有一个事件队列要处理。一个线程将事件添加到队列中。
我已经创建了一个可运行的任务,在run方法中完成处理事件所需的全部任务。
我已经宣布每个任务都有Executors.newCachedThreadPool();和I execute通过executorservice处理顺序事件

 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?
由任务更新了一些状态字段是一个好主意吗?

感谢

+0

你想要的事件来处理一个又一个? – 2010-11-05 08:38:10

+0

@ckuetbach:是的,按照它们的顺序排列。 – Cratylus 2010-11-05 09:12:46

回答

6

Executors.newCachedThreadPool()将根据需要创建新的线程,所以它不是你想要的。你想要的东西像Executors.newSingleThreadExecutor(),它将一次处理一个事件,并排队其余的。

参见javadoc

创建一个使用单个工作线程无界队列操作执行器。 (但是请注意,如果这个单线程在关闭之前由于执行期间的失败而终止,那么如果需要执行后续任务,则将取代它。)任务保证按顺序执行,并且不会有一个任务处于活动状态在任何给定的时间。

+0

因此,每次我调用execute时,runnable都会排队等待由同一个线程处理? – Cratylus 2010-11-05 08:40:49

+1

@ user384706:只有当您的runnable不会抛出异常时。如果是这样,线程将会死亡,并且将启动一个新线程。唯一的保证是一次只有一个线程执行你的任务。 – skaffman 2010-11-05 08:49:17

相关问题