问题标签 [executorservice]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
578 浏览

java - Gridgain 执行器服务

使用 GridGain 的 GridExecutorService 远程执行作业与使用 @Gridify 注释相比有什么优势?

您可以将 java.lang.concurrent.ExecutorService 的实例传递给您的类,并且不依赖于网格框架,但是您会失去任何功能吗?

0 投票
5 回答
24676 浏览

java - Java 执行器:等待任务终止。

我需要提交一些任务,然后等待它们,直到所有结果都可用。他们每个人都将 a 添加String到 a Vector(默认情况下是同步的)。然后我需要为 Vector 中的每个结果启动一个新任务,但只有在所有以前的任务都停止工作时我才需要这样做。

我想使用 Java Executor,特别是我尝试使用Executors.newFixedThreadPool(100)以使用固定数量的线程(我有可变数量的任务,可以是 10 或 500),但我是执行器的新手,我不知道如何等待任务终止。这就像我的程序需要做的伪代码:

我不能做一个 e.shutdown 因为我有一段时间(真的),我需要重用executorService......

你能帮助我吗?你能给我推荐一本关于 java executors 的指南/书吗?

0 投票
5 回答
32577 浏览

java - Java Executors:如何停止提交的任务?

我已经使用 executors 提交了一个任务,我需要它在一段时间后停止(例如 5 分钟)。我试过这样做:

但我总是得到一个错误:我有一个需要由任务修改然后由线程读取的共享向量,即使我停止所有任务,如果发生超时,我会得到:

有什么不对?如何停止提交的 5 分钟后仍在工作的任务?

0 投票
2 回答
3794 浏览

java - 知道所有线程何时完成并处理异常

我正在使用 Executor 框架使用线程池(即 newFixedThreadPool)启动多个线程。我使用 threadpool.submit(aThread) 提交要由线程池执行的作业,这工作正常,但是我需要确定所有线程何时完成,以便我可以继续其他处理。我查看了使用 Future.get() 阻塞直到线程完成这里的问题是它阻塞直到结果可用。我还研究了使用连续调用 isTerminated() 方法,然后在发出关闭后休眠以检查所有线程是否已完成,但这对我来说似乎并不整洁。还有另一种更清洁的方法吗?此外,如果任何一个线程中出现异常,我希望能够终止所有其他正在运行的线程,并阻止池中任何排队的线程启动。执行此操作的最佳机制是什么?

期待听到您的回复

TIA

0 投票
5 回答
17083 浏览

java - 具有可变延迟的 ScheduledExecutorService

假设我有一个任务是从 java.util.concurrent.BlockingQueue 中提取元素并处理它们。

如果可以动态更改频率,我如何安排/重新安排任务?

  • 这个想法是获取数据更新流并将它们批量传播到 GUI
  • 用户应该能够改变更新频率
0 投票
10 回答
22204 浏览

java - ExecutorService 惊人的性能盈亏平衡点——经验法则?

我试图弄清楚如何正确使用 Java 的 Executors。我意识到向 an 提交任务ExecutorService有其自身的开销。但是,我很惊讶地看到它如此之高。

我的程序需要以尽可能低的延迟处理大量数据(股市数据)。大多数计算都是相当简单的算术运算。

我试图测试一些非常简单的东西:“ Math.random() * Math.random()

最简单的测试在一个简单的循环中运行此计算。第二个测试在匿名 Runnable 中执行相同的计算(这应该衡量创建新对象的成本)。第三个测试通过了RunnableExecutorService这衡量了引入执行者的成本)。

我在我的小笔记本电脑(2 cpus,1.5 gig ram)上运行了测试:

(大约有四次运行,前两个数字最终相等)

请注意,执行程序比在单个线程上执行花费的时间要多得多。对于 1 到 8 之间的线程池大小,这些数字大致相同。

问题:我是否遗漏了一些明显的东西或者这些结果是预期的?这些结果告诉我,我传递给执行程序的任何任务都必须进行一些重要的计算。如果我正在处理数百万条消息,并且我需要对每条消息执行非常简单(且成本低廉)的转换,我仍然可能无法使用执行器......尝试将计算分布在多个 CPU 上可能最终会比仅仅花费更多在一个线程中执行它们。设计决策变得比我最初想象的要复杂得多。有什么想法吗?


0 投票
10 回答
25498 浏览

java - 删除 ThreadPoolExecutor 的所有排队任务

我对ThreadPoolExecutor有一个相当简单的问题。我有以下情况:我必须使用队列中的对象,为它们创建适当的工作任务并将它们提交给 ThreadPoolExecutor。这很简单。但是在关闭场景中,许多工作人员可能会排队等待执行。由于其中一个任务可能运行了一个小时,并且我想要相对快速地正常关闭应用程序,因此我想丢弃 ThreadPoolExecutor 中的所有排队任务,而已经处理的任务应该正常完成。

ThreadPoolExecutor 文档有一个remove()方法,但只允许删除特定任务。purge()仅适用于已取消的 Future 任务。我的想法是清除包含所有排队任务的队列。ThreadPoolExecutor 提供对此内部队列的访问,但文档指出:

方法 getQueue() 允许访问工作队列以进行监视和调试。强烈建议不要将此方法用于任何其他目的。

所以抓住这个队列并清除它不是一种选择。此外,这个文档片段说:

当大量排队的任务被取消时,两个提供的方法 remove(java.lang.Runnable) 和 purge() 可用于协助存储回收。

如何?当然,我可以维护我提交给执行程序的所有任务的列表,并且在关闭的情况下,我遍历所有条目并使用 remove() 方法将它们从 ThreadPoolExecutor 中删除......但是......来吧,这是一个浪费内存并且维护这个列表很麻烦。(例如删除已经执行的任务)

我感谢任何提示或解决方案!

0 投票
6 回答
27291 浏览

java - ExecutorService(特别是 ThreadPoolExecutor)线程安全吗?

ExecutorService保证线程安全吗?

我将把来自不同线程的作业提交到同一个 ThreadPoolExecutor,我是否必须在交互/提交任务之前同步对执行器的访问?

0 投票
14 回答
56266 浏览

java - 无法创建具有大小限制的缓存线程池?

似乎不可能创建一个对可以创建的线程数有限制的缓存线程池。

下面是静态Executors.newCachedThreadPool在标准 Java 库中的实现方式:

因此,使用该模板继续创建一个固定大小的缓存线程池:

现在,如果您使用它并提交 3 个任务,一切都会好起来的。提交任何进一步的任务将导致拒绝执行异常。

试试这个:

将导致所有线程顺序执行。即,线程池永远不会产生多个线程来处理您的任务。

这是 ? 的执行方法中的错误ThreadPoolExecutor?或者,也许这是故意的?还是有其他方法?

编辑:我想要与缓存线程池完全一样的东西(它按需创建线程,然后在超时后将它们杀死),但它可以创建的线程数有限制,并且一旦它有继续排队其他任务的能力达到其线程限制。根据 sjlee 的回应,这是不可能的。看它的execute()方法ThreadPoolExecutor确实是不可能的。我需要像确实那样子类化ThreadPoolExecutor和覆盖,但它所做的是一个完整的hack。execute()SwingWorkerSwingWorkerexecute()

0 投票
1 回答
1439 浏览

executorservice - 多线程应用程序中执行器相对于线程的优势是什么

我已经看到了一些关于 Executors 比 Threads 更好的评论,但是如果你有许多线程通过有界缓冲区进行通信(如在基于流的编程中),为什么在你必须使用线程时仍然使用 Executors(使用 newCachedThreadPool (?))。另外,我使用 isAlive()、interrupt() 之类的方法——如何获取线程句柄?

有人有我可以抄袭的示例代码吗?;-)