问题标签 [executor]

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 投票
2 回答
1139 浏览

java - Java Executor:小任务还是大任务?

考虑一个大任务,它可以分解成数百个独立运行的小任务。更具体地说,每个小任务都是发送一个轻量级的网络请求并决定从服务器收到的答案。这些小任务预计不会超过一秒钟,并且总共涉及几台服务器。

我想到了两种使用 Executor 框架来实现它的方法,我想知道哪个更好以及为什么。

  1. 创建一些,比如 5 到 10 个任务,每个任务都涉及进行大量发送和接收。
  2. 为每个发送和接收创建一个任务(可调用或可运行),并安排所有任务(数百个)由执行程序运行。

很抱歉,如果我的问题表明我懒得测试这些并亲自看看什么更好(至少在性能方面)。我的问题,在寻找这个具体案例的答案时,有一个更普遍的方面。在这种情况下,当您想使用执行器来执行所有调度和其他事情时,创建大量小任务还是将它们分组为更少数量的大任务更好?

0 投票
2 回答
21775 浏览

java - 在 Java 中运行基于 cpu 的任务的简单程序的最佳线程池大小是多少

我使用线程池来执行任务,这些任务主要基于 cpu,带有一点 I/O,大小比 cpu 的数量大一。

假设一个简单的程序将其所有任务提交给这个执行程序并且几乎不做其他事情,我认为拥有一个更大的线程池会减慢速度,因为操作系统必须更频繁地对它的 CPU 进行时间切片,从而有机会让线程池中的每个线程都有机会跑。

这是正确的,如果是这样,这是一个真正的问题还是主要是理论上的问题,即如果我将线程池大小增加到 1000,我会注意到一个巨大的差异。

0 投票
2 回答
8472 浏览

java - 如果运行时间过长,我可以使用 executorservice 杀死特定线程吗?

到目前为止,在我对 executorservice 的实验中,我有很多建议涉及使用future.get,然后是future.cancel 以便抛出一个线程中断,然后需要在线程中捕获该线程中断并在那里处理。我的问题有点不同。

假设我正在运行一个线程,它只是跟踪事物运行了多长时间以及它们是否超过了某个阈值,这是否是杀死 executorservice 和所有正在运行的线程的好方法?

思维过程示例:

这行得通吗?我无法检查,因为我的线程非常罕见地失败(大约 1/700 次运行,并且仅在我不工作的一天中的某些时间)。

0 投票
1 回答
163 浏览

java - 如何获取对已调度线程池执行器的 Futures 的引用

我有一个预定的执行器服务,我需要在安排任务后返回 Futures。Javadoc 说调度任务后会返回一个 ScheduledFuture - 但是,我怎样才能获得尚未运行的任务的后续未来?

我的调用如下所示: exec.scheduleAtFixedRate(new Task(), 0, interval, TimeUnit.MINUTES);

确实提交并运行了新任务,但是我只有第一次调用的未来。这个 Future 是可重用的还是可重用的?

0 投票
2 回答
2773 浏览

java - Java-FixedThreadPool 具有已知池大小但未知工作者

所以我想我有点理解固定线程池是如何工作的(使用 Java 内置的 Executor.fixedThreadPool),但据我所知,通常有一定数量的工作你想要完成,当你启动时你知道有多少工作程序。例如

每个 workerThread 做一些非常简单的事情,那部分是任意的。我想知道的是,如果你有一个固定的池大小(比如最大 8 个),但你不知道在运行时之前完成任务需要多少工作人员。

具体示例是:如果我的池大小为 8,并且我正在从标准输入读取数据。当我阅读时,我将输入分成设定大小的块。这些块中的每一个都被提供给一个线程(以及一些其他信息),以便它们可以对其进行压缩。因此,我不知道我需要创建多少个线程,因为我需要继续进行,直到我到达输入的末尾。我还必须以某种方式确保数据保持相同的顺序。如果线程 2 在线程 1 之前完成并且只是提交它的工作,我的数据将是乱序的!

那么在这种情况下线程池会是错误的方法吗?看起来会很棒(因为我一次不能使用超过 8 个线程)。

基本上,我想做这样的事情:

这不是工作代码,我知道,但我只是想说明我想要什么。

我遗漏了一点,但是看看 buff 和 dict 的值是如何变化的,我不知道输入有多长。我认为我实际上不能这样做,因为在第一次通话后,工人已经存在了!我不能只说 worker = new WorkerThread 很多时间,因为它不是已经指向一个现有线程(真的,一个可能已经死的线程)并且显然在这个实现中,如果它确实有效,我就不会运行在平行下。但我的意思是,我想继续创建线程,直到达到最大池大小,等到一个线程完成,然后继续创建线程,直到我达到输入的结尾。

我还需要整理东西,这是真正令人讨厌的部分。

0 投票
1 回答
305 浏览

java - 重新初始化 Executor 的最佳实践

我有一个Swing应用程序,它使用 aThreadPoolExecutor来执行多个任务。在某一时刻,我想重新初始化所有内容。我正在使用executor.purge();executor.getQueue().clear();这够了吗?有没有更好的方法/做法来执行此操作?提前致谢。

0 投票
1 回答
838 浏览

spring - grails executor plugin - executorService 注入

尝试在我的服务中使用 executorService 注入,但失败了。当我阅读插件的文档时,它提到 executorService 是通过 conf/spring/resources.groovy 文件注入的。但是我的 resources.groovy 文件是空的(实际上是一个空的 bean 定义)并且不确定我是否需要在其中放一些东西。

我错过了什么?

0 投票
2 回答
645 浏览

java - ExecutorService 与任务链关闭

我有一个ExecutorService执行任务,它本身向 ExecutorService 提交新任务。

当我打电话时.shutdown(),我希望正在运行的任务仍然能够向需要完成的 ExecutorService 提交新任务。但我不希望能够从外部提交新任务到ExecutorService.

ExecutorService关闭时如何仍然允许任务提交子任务?

0 投票
2 回答
1532 浏览

java - 有没有办法取消和重用 ExecutorService?

我正在编写一个 Java Fractal Explorer,分形计算是多线程完成的。以前,我只是创建了一堆线程(与系统有处理器内核一样多)并将它们保存在一个数组中,但这会导致几个问题并且不是很优雅,现在我想切换到 Executors。

我需要的功能是:

  • 用户可以随时选择分形图像的新区域进行放大,因此应该可以随时取消计算,并立即重新插入新任务
  • 为了获得更好的性能,线程应该被重用(并且在取消后仍然存在)

我的问题是,当我在调用 shutdownNow()(取消)后提交新任务时,Java ExecutorService(我使用 Executors.newFixedThreadPool())会引发异常。我当然可以只创建一个新的 ExecutorService,但是必须再次创建所有线程,据我了解,这非常昂贵(这是使用线程池的全部意义)。

所以基本上我需要的是一个使用线程池的 ExecutorService 实现,可以在不关闭它的情况下取消它,所以它可以被重用。

已经有这样的东西还是我必须自己写?(不能太难,对吧?;))

我当前的代码可以在https://github.com/lucaswerkmeister/JFractalizer找到。

提前致谢,

卢卡斯

PS:当使用执行器时,我会将图像分割成比线程更多的部分,因此如果一个部分完成得更快,则线程不会空闲,而是可以继续处理图像的另一部分。尽管如此,如果所有部分都可以并行计算,而不是某些部分比其他部分开始晚,那将是很酷的,但这只是一个奖励。

0 投票
2 回答
1085 浏览

android - Android 上的多个同时 HTTP 请求

所以,我在 AsyncTask 中有下面的代码,并且想要调用 7 个不同的异步 HTTP 请求。一切正常,所有 7 个 execute() 方法同时启动(花几毫秒,这很棒)。

不幸的是,这种方法所花费的时间是大约。16 秒。如果我排除所有执行程序的内容并在原始工作程序 Asynctask 上调用 HTTP 下载方法,则需要 aprox。9 秒。因此,实际上按顺序而不是并发花费的时间更少。任何想法为什么会发生这种情况?也许服务器端的东西?也许是因为执行程序是在 Asynctask 上启动的?非常感谢 !