问题标签 [threadpoolexecutor]

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 投票
8 回答
118788 浏览

java - Executors.newCachedThreadPool() 与 Executors.newFixedThreadPool()

newCachedThreadPool()相对newFixedThreadPool()

我什么时候应该使用其中一种?在资源利用方面哪种策略更好?

0 投票
14 回答
56266 浏览

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

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

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

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

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

试试这个:

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

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

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

0 投票
12 回答
201313 浏览

java - 处理来自 Java ExecutorService 任务的异常

我正在尝试使用 Java 的ThreadPoolExecutor类来运行具有固定数量线程的大量重量级任务。每个任务都有很多地方可能由于异常而失败。

我已经子类ThreadPoolExecutor化并且我已经覆盖了afterExecute应该提供运行任务时遇到的任何未捕获异常的方法。但是,我似乎无法让它工作。

例如:

该程序的输出是“一切正常——情况正常!” 即使提交给线程池的唯一 Runnable 抛出异常。有什么线索吗?

谢谢!

0 投票
3 回答
26939 浏览

java - 处理 ThreadPoolExecutor 的异常

我有以下代码片段,它基本上扫描了需要执行的任务列表,然后将每个任务交给执行者执行。

反过来JobExecutor创建另一个执行程序(用于执行数据库操作...读取和写入数据到队列)并完成任务。

JobExecutorFuture<Boolean>为提交的任务返回一个。当其中一项任务失败时,我想优雅地中断所有线程并通过捕获所有异常来关闭执行程序。我需要做哪些改变?

0 投票
7 回答
68357 浏览

java - 如何在不关闭 Executor 的情况下等待 ThreadPoolExecutor 中的所有任务完成?

我不能使用shutdown()awaitTermination()因为它可能会在等待时将新任务添加到 ThreadPoolExecutor 中。

所以我正在寻找一种方法来等到 ThreadPoolExecutor 清空它的队列并完成它的所有任务,而不停止在此之前添加新任务。

如果它有任何区别,这适用于Android。

谢谢

更新:很多周后重新访问后,我发现修改后的 CountDownLatch 在这种情况下对我来说效果更好。我会保留答案,因为它更适用于我的要求。

0 投票
3 回答
839 浏览

java - Java ExecutorService - 缩放

我正在尝试使用 JavaExecutorService及其功能编写一个程序invokeAll。我的问题是:该invokeAll功能是否同时解决了任务?我的意思是,如果我有两个处理器,会同时有两个工人吗?因为我无法使其正确缩放。如果我给newFixedThreadPool(2)或 1,完成问题需要相同的时间。

Map是一个实现Callable并且wp是部分解决方案的向量的类,该类在不同时间保存一些信息。

为什么不能缩放?可能是什么问题呢?

这是 PartialSolution 的代码:

这是地图的代码:

所以在地图中,我从片段中取出每一行并搜索每个表达式的出现次数,我还保存了行数。在处理完所有片段后,在同一个 PartialSolution 中,我将信息保存在哈希图中并返回新的 PartialSolution。在下一步中,我将 PartialSolutions 与相同的文件名结合起来,并将它们引入一个 Callable 类 Reduce,它与 map 相同,不同之处在于它进行其他操作,但也返回一个 PartialSolution。

这是运行地图任务的代码:

在任务中,我创建 Map 类型的任务,并在列表中获取它们。我不知道如何阅读 JVM 线程转储。我希望我给你的信息足够好。如果有帮助,我在 NetBeans 7.0.1 中工作。

谢谢你,亚历克斯

0 投票
4 回答
7031 浏览

java - Java-5 ThreadPoolExecutor 与 Java-7 ForkJoinPool 相比有什么优势?

Java 5 以 Executor 框架的形式引入了对线程池异步任务执行的支持,其核心是 java.util.concurrent.ThreadPoolExecutor 实现的线程池。Java 7 以 java.util.concurrent.ForkJoinPool 的形式添加了一个替代线程池。

查看它们各自的 API,ForkJoinPool 在标准场景中提供了 ThreadPoolExecutor 功能的超集(尽管严格来说 ThreadPoolExecutor 提供了比 ForkJoinPool 更多的调优机会)。除此之外,观察到 fork/join 任务似乎更快(可能是由于工作窃取调度程序),需要的线程肯定更少(由于非阻塞连接操作),人们可能会觉得 ThreadPoolExecutor 已被取代ForkJoinPool。

但这真的正确吗?我读过的所有材料似乎都总结了两种线程池之间相当模糊的区别:

  • ForkJoinPool 用于许多相关的、任务生成的、短的、几乎不会阻塞(即计算密集型)任务
  • ThreadPoolExecutor 用于少数、独立、外部生成、长、有时阻塞的任务

这种区别完全正确吗?我们能说得更具体一点吗?

0 投票
3 回答
691 浏览

java - Android ThreadPoolExecutor 和 join()

我有一个线程池执行器,它有几个同时运行的线程。我想在所有线程完成后执行一些代码。我怎样才能做到这一点?

0 投票
1 回答
369 浏览

java - Java FixedThreadPool 不适用于设置池大小?

我正在为工作线程使用 FixedThreadPool 。这是我创建它的方式:

所以我将它的大小设置为 25,我假设任何时候最多只能有 25 个活动线程?(如我错了请纠正我)。

那么如果线程池中有空闲线程,我的主线程会不断尝试一次提交 30 个工作线程:

但是当我调试它时,我得到了这个日志:

队列总是空的,core_pool_size 仍然是 1000,po​​ol_size 一直在增加直到 1000,但我假设 core_pool_size 应该是 25,应该有排队的任务?

我做错了什么或误解了这一点吗?

任何帮助将不胜感激,谢谢!

这就是我生成日志的方式:

0 投票
2 回答
10806 浏览

java - ThreadPoolExecutor 和队列

我认为使用ThreadPoolExecutor我们可以提交RunnableBlockingQueue在构造函数中传递或使用execute方法执行的 s。
另外我的理解是,如果任务可用,它将被执行。
我不明白的是:

executor.prestartAllCoreThreads();除非我在构造函数中取消注释或调用execute打印的可运行文件System.out.println("++++++++++++++");(它也被注释掉) ,否则这段代码不会做任何事情。

为什么?
引用(我的重点):

默认情况下,即使是核心线程也只会在新任务到达时才最初创建和启动,但这可以使用方法 prestartCoreThread() 或 prestartAllCoreThreads() 动态覆盖。如果您使用非空队列构造池,您可能希望预启动线程。

行。所以我的队列不是空的。但是我创建了s ,然后我将新executor的s 添加到队列中(在循环中到 100)。 这个循环不算吗? 为什么它不起作用,我必须要么或明确地打电话?sleepRunnable
new tasks arrive
prestartexecute