Tag: executorservice

如何检查ExecutorService上运行的所有任务是否都已完成

我有ConcurrentLinkedDeque,我正在使用同步推/弹元素,我有一些异步任务,从堆栈中取一个元素,如果这个元素有邻居它正在推动它堆栈。 示例代码: private ConcurrentLinkedDeque stack = new ConcurrentLinkedDeque(); private ExecutorService exec = Executors.newFixedThreadPool(5); while ((item = stack.pollFirst()) != null) { if (item == null) { } else { Runnable worker = new Solider(this, item); exec.execute(worker); } } class Solider{ public void run(){ if(item.hasNeighbors){ for(Item item:item.neighbors){ stack.push(item) } } } } 我想在while循环中有另外的声明来回答这个问题 – “Executor中的任何任务都在工作吗?”

如何为CompletableFuture :: supplyAsync选择Executor

CompletableFuture::supplyAsync(() -> IO bound queries) 如何为CompletableFuture :: supplyAsync选择Executor以避免污染ForkJoinPool.commonPool() 。 Executors有很多选项( newCachedThreadPool , newWorkStealingPool , newFixedThreadPool等) 我在这里阅读了有关新ForkJoinPool的内容 如何为我的用例选择合适的一个?

优雅地将队列长度指示符实现到ExecutorServices

为什么,为什么java.util.concurrent没有为其ExecutorService提供队列长度指示器? 最近我发现自己做了这样的事情: ExecutorService queue = Executors.newSingleThreadExecutor(); AtomicInteger queueLength = new AtomicInteger(); … public void addTaskToQueue(Runnable runnable) { if (queueLength.get() < MAX_QUEUE_LENGTH) { queueLength.incrementAndGet(); // Increment queue when submitting task. queue.submit(new Runnable() { public void run() { runnable.run(); queueLength.decrementAndGet(); // Decrement queue when task done. } }); } else { // Trigger error: too long queue […]

执行程序优于新线程的优点

在Java程序中使用Executors而不仅仅是Threads有什么好处。 如 ExecutorService pool = Executors.newFixedThreadPool(2); void someMethod() { //Thread new Thread(new SomeRunnable()).start(); //vs //Executor pool.execute(new SomeRunnable()); } 执行程序是否仅限制允许一次运行的线程数(线程池)? 它是否实际上将runnable复用到它创建的线程上? 如果不是它只是一种方法来避免每次都要编写新的Thread(runnable).start()?

Control ExecutorService每秒最多执行N个任务

如何控制/限制提交给ExecutorService的任务? 我有SMSTask发送SMS消息,我需要控制执行程序,以便它只能发送最多N条消息/秒。

什么是Java中最快的循环同步(ExecutorService与CyclicBarrier vs.X)?

哪个Java同步构造可能为具有固定数量线程的并发迭代处理场景提供最佳性能,如下所述? 在我自己试验了一段时间后(使用ExecutorService和CyclicBarrier)并对结果感到有些惊讶,我会感谢一些专家建议和一些新想法。 这里的现有问题似乎并不主要关注绩效,因此这个新问题。 提前致谢! 该应用程序的核心是一个简单的迭代数据处理算法,与Mac Pro上8个内核的计算负载并行,运行OS X 10.6和Java 1.6.0_07。 要处理的数据被分成8个块,每个块被送到Runnable,由固定数量的线程之一执行。 并行化算法是相当简单的,它在function上按预期工作,但它的性能还不是我认为的可能。 该应用程序似乎花了很多时间在系统调用同步,所以经过一些分析后,我想知道我是否选择了最合适的同步机制。 该算法的一个关键要求是它需要分阶段进行,因此线程需要在每个阶段结束时进行同步。 主线程准备工作(非常低的开销),将其传递给线程,让它们处理它,然后在完成所有线程后继续,重新安排工作(再次非常低的开销)并重复循环。 该机器专用于此任务,通过使用预分配项的每线程池来最小化垃圾收集,并且可以修复线程数(没有传入请求等,每个CPU核心只有一个线程)。 V1 – ExecutorService 我的第一个实现使用了一个带有8个工作线程的ExecutorService。 该程序创建8个任务来完成工作,然后让他们处理它,大致如下: // create one thread per CPU executorService = Executors.newFixedThreadPool( 8 ); … // now process data in cycles while( …) { // package data into 8 work items … // create one Callable task per […]

在ExecutorService上安排的守护程序线程; 解释为什么这是不好的forms

我对使用ExectuorService安排的线程有序关闭的想法很满意; 也就是说,调用shutdown或shutdownNow将导致池上创建的线程正常退出。 如果他们响应interrupt你可以确定最终会被调用等等,你将得到一个干净,可预测的退出(你可以清理任何资源等)。 但是,如果您已将线程设置为守护程序(通过执行程序的ThreadFactory ),如下所示。 ExecutorService pool = Executors.newSingleThreadExecutor(new ThreadFactory() { @Override public Thread newThread(Runnable runnable) { Thread thread = Executors.defaultThreadFactory().newThread(runnable); thread.setDaemon(true); return thread; } }); 主线程终止后,VM将突然终止任何守护程序线程。 在上面的示例中,调度然后突然终止的(守护程序)线程将绕过任何finally块,并且任何可中断的方法都不会抛出InterruptedException 。 所以,我倾向于认为将ThreadPoolExecutor使用的线程标记为守护进程是不好的做法……我的问题是关于帮助我发声的原因 。 为什么在ExecutorService的线程池中使用守护程序线程是不好的做法(或者如果你不同意)? 特别是我有兴趣通过正常关闭(具有中断策略并且运行良好的线程)与守护程序线程来描述VM关闭的生命周期。 扩展最后一点,在ThreadPoolExecutor上finalize将自己调用shutdown ,但是当它使用守护进程线程时,如果VM调用了finalize ,它们可能已经终止。 那么线程池的行为是什么? 如果底层线程突然终止,它是否可以被欺骗以保持活动状态(因此不会退出VM)? 我问的部分原因是因为我已经看到它曾经绕过了关闭实际的ExectorService的需要。 您能想到绕过其关闭生命周期会产生不良影响的情况吗? 到目前为止,我能够提出使用守护进程的唯一原因是采取捷径,我想欣赏它可能导致的任何意外的副作用。

Java支持三种不同的并发模型

我在multithreading环境中经历了不同的并发模型( http://tutorials.jenkov.com/java-concurrency/concurrency-models.html ) 本文重点介绍了三种并发模型 。 并行工人 第一个并发模型就是我所说的并行工作模型。 传入的工作分配给不同的工作人员 。 流水线 工人的组织就像工厂assembly线上的工人一样。 每个工人只执行完整工作的一部分。 当该部分完成时,工人将工作转发给下一个工人。 每个工作者都在自己的线程中运行,并且不与其他工作者共享任何状态。 这有时也称为无共享并发模型。 function并行 函数并行的基本思想是使用函数调用实现程序。 函数可以被视为彼此发送消息的“ 代理 ”或“ 参与者 ”,就像在流水线并发模型(AKA反应或事件驱动系统)中一样。 当一个函数调用另一个函数时,这类似于发送消息。 现在我想为这三个概念映射java API支持 并行工作者 :它是ExecutorService , ThreadPoolExecutor , CountDownLatch API吗? assembly线 :将事件发送到JMS等消息传递系统并使用队列和主题的消息传递概念。 function并行 : ForkJoinPool在某种程度上和java 8流。 与溪流相比,ForkJoin池易于理解。 我是否正确映射这些并发模型? 如果没有,请纠正我。

如何决定是使用newCachedThreadPool还是newFixedThreadPool?

我正在开展一个项目,我需要确保每个线程都在特定范围内工作。 例如: NO_OF_THREADS: 2 NO_OF_TASKS: 10 如果number of threads is 2且number of tasks is 10则每个线程将执行10 tasks 。 这意味着2个线程将20 tasks 。 在实际场景中,这些数字(任务数和线程数)将非常高,因为它们都可以在我的代码中配置。 在上面的示例中, first thread应该使用1 and 10之间的id, second thread应该使用11 and 20之间的id,如果有更multithreading则应该使用。 之后,每个线程将建立数据库连接,然后插入数据库。 所以我的下面的代码工作正常。 public static void main(String[] args) { final int noOfThreads = 2; final int noOfTasks = 10; //create thread pool with given size ExecutorService […]

使用ExecutorService执行异步任务时出现问题

我之前曾问过一个关于ExecutorService和Apache Velocity初始化的问题。 为了快速回顾一下 – 我有一个接受用户请求的Java EE前端,然后对于每个请求,使用ExecutorService(设置为守护进程的SingleThreadedExecutor)启动冗长的工作流。此工作流包含在库中并且可以工作当通过eclipse在独立模式下运行时,正如预期的那样。 当从网站(servlet)调用时,我观察到工作流一直在Velocity Engine初始化的位置(Velocity.init()或ve.init())。 因此我的上述问题。 当没有任何答案/建议有效时,我推断这与Velocity启动并决定转向FreeMarker的方式有关。 现在我看到工作流程也悬挂在FreeMarker实现的完全相同的位置。 这个’place’是邮件构建部分,它根据传递的数据对象的coupel评估模板并返回邮件字符串。调用Freemark’ing类和FreeMark类的类如下 – public class mailBuilder { private static final Logger log = Logger.getLogger( mailBuilder.class ); static String a; static String b; public mailBuilder(CustomDataStructure input) { a = input.getA(); b = input.getB(); } public static String returnMailstring() throws Exception { log.info(“Gathering elements to construct email.”); […]