Java 如果对CompletableFuture.runAsync()调用过多,会发生什么情况?
因此,我面临着这样一种情况:我正在编写一个java应用程序来对某些事件做出反应。需要处理收到的每个事件,处理可能需要一些时间。因此,我的应用程序基本上执行以下操作:Java 如果对CompletableFuture.runAsync()调用过多,会发生什么情况?,java,concurrency,completable-future,Java,Concurrency,Completable Future,因此,我面临着这样一种情况:我正在编写一个java应用程序来对某些事件做出反应。需要处理收到的每个事件,处理可能需要一些时间。因此,我的应用程序基本上执行以下操作: 它接收事件 它调用CompletableFuture.runAsync(()->EventProcessor.process(event)) i、 e 我的问题是: 如果我收到大量事件,会发生什么?因为处理事件可能需要一些时间(例如10分钟) 如何管理和安排后台任务?他们会被杀吗?如果是,如何控制计划/终止行为 如果我收到大量
- 它接收事件
- 它调用
CompletableFuture.runAsync(()->EventProcessor.process(event))代码>
- 如果我收到大量事件,会发生什么?因为处理事件可能需要一些时间(例如10分钟)
- 如何管理和安排后台任务?他们会被杀吗?如果是,如何控制计划/终止行为
如果任务成功提交,它将在更早或更晚的时间执行。只有您可以显式取消它。当然,如果您提交1000个10分钟的任务,您可以将结果等待几天。From:“所有没有显式执行器参数的异步方法都是使用”执行的,最有可能的是,一些提交的任务在其他任务完成之前不会执行,从而释放线程池中的线程。From:“所有没有显式执行器参数的异步方法都使用”最有可能的是,一些提交的任务在其他任务完成之前不会执行,从而释放线程池中的线程。
如果执行器的输入队列大小有限
如何控制队列的大小?请为您自己的执行器准备无限队列。LinkedBlockingQueue是您的最佳选择。请参见,w如果未指定执行器,则使用公共ForkJoinPool
,并在结尾处显示:“此实现仅在池关闭或内部资源耗尽时才拒绝提交的任务(即通过抛出RejectedExecutionException)。(并且公共池无法关闭).如果执行器的输入队列的大小受到限制
如何控制队列的大小?为您自己的执行器准备无限队列。LinkedBlockingQueue是您的最佳选择。如中所述,当未指定执行器时,将使用公共ForkJoinPool
,并在结尾处显示:“此实现仅在池关闭或内部资源耗尽时才拒绝提交的任务(即通过抛出RejectedExecutionException)。”(并且无法关闭公共池)。
Class EventHandler implements Handler {
public void handleEvent(Event event) {
CompletableFuture.runAsync(() -> EventProcessor.process(event));
}
}