java - java并发包中是否有任何执行器可以保证所有任务都按照提交的顺序完成?

标签 java concurrency producer-consumer executorservice

用于演示标题中的想法的代码示例:

executor.submit(runnable1);
executor.submit(runnable2);

我需要确保 runnable1 将在 runnable2 启动之前完成,并且我在执行程序文档中没有找到此类行为的任何证据。

关于我正在解决的问题: 我需要将大量日志写入文件。每个日志都需要大量的预计算(格式化和其他一些东西)。因此,我想将每个日志记录任务放入一种队列中,并在单独的线程中处理这些任务。当然,保持日志有序也很重要。

最佳答案

单线程执行器将按照提交的顺序执行所有任务。如果您希望同时执行任务,则只能使用具有多个线程的线程池。

将任务添加到队列本身的成本就很高。您可以使用这样的 Exchanger

http://vanillajava.blogspot.com/2011/09/exchange-and-gc-less-java.html?z#!/2011/09/exchange-and-gc-less-java.html

这可以避免使用队列或创建对象。

另一种更快的替代方法是使用不需要后台线程的内存映射文件(实际上操作系统在后台工作),这又快得多。它支持亚微秒延迟和每秒数百万条消息。

https://github.com/peter-lawrey/Java-Chronicle

关于java - java并发包中是否有任何执行器可以保证所有任务都按照提交的顺序完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9410422/

相关文章:

java - java中if语句中的while循环

java - 什么时候并行执行任务是一种矫枉过正的行为?

java - Java 中的字符串操作 : replace spaces and commas with one comma

java - playframework: WSRequestHolderholder = WS.url(url) -> 错误:没有找到适合 url(String) 的方法

python - Concurrent.futures : what are the use cases for map() vs. 提交()?

具有停止条件的 Java 生产者-消费者

c# - 使用 4.0 框架类和阻塞集合的 C# 中的生产者/混合消费者

python - 为什么 asyncio 队列等待 get() 会阻塞?

java - JPA - 返回 StartDate 之后和 EndDate 之前的实体

java - 在一组文档上使用 ForkJoinPool