Tag: executorservice

等待线程在执行程序服务中完成

我用N个线程初始化了一个exectuor服务。 在N个线程完成之后,我想等待一段时间,然后使用N个线程的新实例重用执行程序。 我该怎么做呢? 这是我正在使用的示例代码失败: int NumberOfThreads=Integer.parseInt(PropertyHandler.getProperty(“numberOfThreads”)); ExecutorService executor = Executors.newFixedThreadPool(NumberOfThreads); log.info(“Executor class has been initialized”); while (true) { jobStack = MrMestri.buildJobs(); log.info(“Creating a job stack of the search urls”); if (jobStack.isEmpty()) { Thread.sleep(10000); } else { int jobToken = 0; while (jobStack.size() > 0) { jobToken++; MrRunnable worker = new MrRunnable(jobStack.pop()); executor.execute(worker); if (jobToken% Integer.parseInt(PropertyHandler.getProperty(“totalTrends”)) […]

Java ServiceExecutor终止条件

我是java执行器的新手。 我正在使用Java的ExecutorService来启动多个线程来处理数据。 Executor executor = Executors.newFixedThreadPool(poolSize); for(int i=0; i< 5;i++) executor.execute(new MyRunnable(i)); 一旦线程找不到数据,它们就会优雅地终止。 我的问题是当所有线程终止时,Executor会发生什么,它是否仍在运行其主线程? 或者它将自行终止,整个申请将优雅地完成? 如果执行程序线程仍然运行,我怎么能让它在所有子线程完成后终止(poolSize线程数)。

Future.cancel(true)下面发生了什么

假设我有一个Runnable实例: class MyTask implements Runnable { public void run() { //some heavy calculation which takes time Thread.sleep(5000) //rest code … } } 然后,我使用ExecutorService提交上述任务: ExecutorService service = Executors.newFixedThreadPool(3); Future task = service.submit(new MyTask()); 现在,我可以通过task.cancel(true);取消任务task.cancel(true); 。 我所理解的是task.cancel(true)将中断运行此任务的工作线程,如Thread.currentThread().interrupt() 。 但是这只会设置一个标志来告诉工作线程是否被中断。 我的问题是:如果MyTask Runnable已经开始运行, future.cancel(true)实际上是如何在run()停止执行其余代码的代码? 是否有定期检查下方工作线程的中断标志? 我的意思是我不明白如何只通过将interrupt标志设置为true来取消run()中的代码。

ExecutorService Future ::变得非常慢

我正在并行化一个非常复杂的程序来加快速度。 为此,我大部分时间都使用ExecutorService 。 到目前为止它工作得很好,但后来我注意到只有一行代码使我的程序运行速度尽可能快一半。 这是exactScore.get()的行。 我不知道为什么,但它有时需要更多的0.1秒来获得Future Object的double值。 为什么是这样? 如何处理它运行得更快? 在multithreading中有没有办法直接在Double[]编写? 谢谢 int processors = Runtime.getRuntime().availableProcessors(); ExecutorService service = Executors.newFixedThreadPool(processors); // initialize output Double[] presortedExScores = new Double[sortedHeuScores.length]; for(int i =0; i < sortedHeuScores.length; i++ ){ final int index = i; final Collection formulas_for_exact_method = multimap.get(sortedHeuScores[i]); for (final MolecularFormula formula : formulas_for_exact_method){ Future exactScore = service.submit(new […]

ExecutorService在调用线程中运行任务?

是否有任何java.util.ExecutorService实现只是在调用线程中运行所有已执行的任务? 如果默认情况下这不包含在Java中,是否有一个包含这样的实现的库?

将代码从使用定时器移植到scheduledexecutorservice

我正在尝试将代码从使用java 计时器移植到使用scheduledexecutorservice 我有以下用例 class A { public boolean execute() { try { Timer t = new Timer(); t.schedule (new ATimerTask(), period, delay); } catch (Exception e) { return false; } } } class B { public boolean execute() { try { Timer t = new Timer(); t.schedule (new BTimerTask(), period, delay); } catch (Exception e) […]

如何立即停止使用ExecutorService启动的任务?

我已经尝试了许多不同的方法来立即停止使用ExecutorService启动的任务,但没有运气。 Future future = executorService.submit(new Callable( public Void call () { … do many other things here.. if(Thread.currentThread.isInterrupted()) { return null; } … do many other things here.. if(Thread.currentThread.isInterrupted()) { return null; } } )); if(flag) { // may be true and directly cancel the task future.cancel(true); } 有时候我需要在启动后立即取消任务,你可能会好奇我为什么要这样做,你可能会想象一个用户不小心点击“下载”按钮启动“下载任务”并且他立即想要取消操作,因为它只是偶然的点击。 问题是在调用future.cancel(true)之后 ,任务没有停止, Thread.currentThread.isInterrupted()仍然返回false ,我无法知道任务是从call()方法内部停止的。 我想在调用future.cancel(true)并在call()方法中不断检查该标志后设置一个像cancelled = […]

优化许多文件的并行处理

我有一个程序处理大量文件,每个文件需要完成两件事:首先,读取并处理文件的某些部分,然后存储生成的MyFileData 。 第一部分可以并行化,第二部分不能。 按顺序执行所有操作非常慢,因为CPU必须等待磁盘,然后它会工作一点,然后它会发出另一个请求,然后再次等待… 我做了以下 class MyCallable implements Callable { MyCallable(File file) { this.file = file; } public MyFileData call() { return someSlowOperation(file); } private final File file; } for (File f : files) futures.add(executorService.submit(new MyCallable(f))); for (Future f : futures) sequentialOperation(f.get()); 它帮助了很多。 但是,我想改进两件事: sequentialOperation以固定顺序执行,而不是先处理可用的结果。 我该怎么改变它? 有数千个文件需要处理,启动数千个磁盘请求可能导致磁盘丢失。 通过使用Executors.newFixedThreadPool(10)我限制了这个数字,但是我正在寻找更好的东西。 理想情况下,它应该是自我调整的,以便它在不同的计算机上工作最佳(例如,当RAID和/或NCQ可用时发出更多请求等)。 我不认为它可能基于找到硬件配置,但测量处理速度和基于它的优化应该是可能的。 任何想法?

ExecutorService的shutdown()不会等到所有线程都完成

我有一个代码,其中4个线程同时运行。 我想等到所有这4个线程都完成。 只有在那之后继续app流程。 我尝试了两种方法: Thread#join() ,这种方法按预期工作。 join()之后的代码仅在所有线程完成后执行。 ExecutorService#shutdown() ,这种技术允许在shutdown()之后执行代码,即使并非所有线程都已完成。 代码示例: ExecutorService service = Executors.newFixedThreadPool(cpuCoresNum); for (int i = 0; i { try { foo(); // some long execution function } catch (Exception e) { e.printStackTrace(); } }); } service.shutdown(); System.out.println(“We’re done! All threads are finished!”); 我的问题: 为什么submit()和shutdown()不要等到所有线程都完成并打印«我们已经完成了! 所有线程都已完成!»在调用service.shutdown();之后立即完成! ?

Java从ExecutorService设置回调

我有一个fixedThreadPool,我用它来运行一堆工作线程来实现具有许多组件的任务的并行执行。 当所有线程都完成后,我使用方法(getResult)检索它们的结果(相当大)并将它们写入文件。 最终,为了节省内存并能够看到中间结果,我希望每个线程在完成执行后立即将其结果写入文件,然后释放其内存。 通常,我会在run()方法的末尾添加代码。 但是,此类中的某些其他对象也会调用这些线程,但不要让它们将结果写入文件 – 而是使用其结果执行其他计算,最终将其写入文件。 所以,我想知道是否可以使用ExecutorService将回调函数附加到线程完成事件。 这样,我可以立即检索其结果并在该场景中释放内存,但在其他场景中使用这些线程时不会破坏代码。 这样的事情可能吗?