0

我有一个事件队列要处理。线程将事件添加到队列中。
我创建了一个可运行的任务,该任务在该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?
让任务更新一些状态字段是个好主意吗?

谢谢

4

2 回答 2

6

Executors.newCachedThreadPool()将按需创建新线程,因此这不是您想要的。你想要类似的东西Executors.newSingleThreadExecutor(),它会一次处理一个事件,并将其余的排队。

请参阅javadoc

创建一个使用单个工作线程在无界队列上运行的 Executor。(但请注意,如果该单线程在关闭前的执行过程中因故障而终止,如果需要执行后续任务,则新线程将取代它。)任务保证按顺序执行,并且不会有超过一个任务处于活动状态在任何给定时间。

于 2010-11-05T08:38:07.677 回答
0

我认为方法是解决您的问题Executors.newSingleThreadExecutor()的方法:http: //download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorService.htmlsubmit()

于 2010-11-05T09:16:20.473 回答