Java 通过executorservice进行顺序事件处理

Java 通过executorservice进行顺序事件处理,java,multithreading,event-handling,queue,executorservice,Java,Multithreading,Event Handling,Queue,Executorservice,我有一个事件队列要处理。线程将事件添加到队列中。 我创建了一个可运行任务,该任务在run方法中执行处理事件所需的所有操作。 我已经声明了一个Executors.newCachedThreadPool()和我执行每个任务 public class EventHandler { private static final ExecutorService handlers = Executors.newCachedThreadPool();

我有一个事件队列要处理。线程将事件添加到队列中。
我创建了一个可运行任务,该任务在
run
方法中执行处理事件所需的所有操作。
我已经声明了一个
Executors.newCachedThreadPool()和我执行每个任务

        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
,我的代码将获得下一个事件,并通过执行器运行next runnable。 我的目的是仅在上一个任务结束后处理队列中的下一个事件。
我如何知道上一个任务是否已完成,以便可以再次调用handleNextEvent?
由任务更新某些状态字段是一个好主意吗


感谢执行者。newCachedThreadPool()将根据需要创建新线程,因此这不是您想要的。您需要类似于
Executors.newSingleThreadExecutor()
的东西,它将一次处理一个事件,并将其余事件排队

见:

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


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

见:

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


我认为
Executors.newSingleThreadExecutor()
submit()
方法是您问题的解决方案:

我认为
Executors.newSingleThreadExecutor()
submit()
方法是您问题的解决方案:

您希望事件一个接一个地处理吗?@ckuetbach:是的,按照它们进入的顺序。是否希望事件一个接一个地处理?@ckuetbach:是的,按照它们进入的顺序处理。因此,每次我调用execute时,runnable都会排队由同一线程处理?@user384706:仅当runnable没有引发异常时。如果它这样做了,线程将死亡,一个新的线程将启动。唯一的保证是一次只能有一个线程执行您的任务。因此,每次我调用execute时,runnable都会排队由同一个线程处理?@user384706:仅当runnable没有引发异常时。如果它这样做了,线程将死亡,一个新的线程将启动。唯一的保证是一次只能有一个线程执行您的任务。