问题标签 [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 投票
3 回答
1341 浏览

java - Java - Executors 有什么了不起的?

在没有 Java Executors 的生活中,必须为每个 Runnable 任务创建新线程。创建新线程需要线程开销(创建和拆除),这会增加非执行程序程序的复杂性和浪费时间。

参考代码:

没有 Java 执行器 -

使用 Java 执行器 -

底线是 Executors 抽象了如何管理线程的低级细节。

真的吗?

谢谢。

0 投票
7 回答
21769 浏览

java - 如何使用 ThreadPoolExecutor 和自定义任务实现 PriorityBlockingQueue

我搜索了很多,但找不到解决我的问题的方法。

我有自己的班级,BaseTask使用 aThreadPoolExecutor来处理任务。我想要任务优先级,但是当我尝试使用 a 时,PriorityBlockingQueue我得到ClassCastException了因为ThreadPoolExecutor它将我的任务包装到一个FutureTask对象中。

这显然是有道理的,因为FutureTask没有实现Comparable,但是我将如何继续解决优先级问题?我读过你可以覆盖newTaskFor()in ThreadPoolExecutor,但我似乎根本找不到这种方法......?

我们欢迎所有的建议!

一些帮助的代码:

在我的BaseTask课上,我有

BaseFutureTask课堂上

BaseThreadPoolExecutor类中,我覆盖了 3 个submit方法......这个类中的构造函数被调用,但没有一个submit方法

0 投票
2 回答
6629 浏览

android - 多次调用 Looper 会导致“向死线程上的处理程序发送消息”

我正在使用带有我自己的 ThreadFactory 的 Executor [固定线程池],它添加了一个 Looper:

我正在运行一个发出网络请求的线程,但如果网络出现故障,我希望向用户显示一条对话框消息。这个过程相当复杂,因为它需要在 UI 线程中发出并显示请求。我可以通过简单地向网络线程添加一个循环并等待从 UI 线程发送消息来等待用户对对话框的响应。这允许我将网络请求封装在一个 while(tryAgain) 线程中。除了第二次调用 Looper.loop() 方法(显示第二个网络错误对话框之后)并且对话框(在 UI 线程中)将消息发送到网络线程的处理程序时,一切都运行良好:

在 AlertDialog 实例中是一个 OnClickListener:

我已经检查过该线程仍然处于活动状态,handler.getLooper().getThread().isAlive()它总是返回 true,但它仍然给我“向死线程上的处理程序发送消息”。消息/处理程序如何决定线程已死?它不应该依赖 .isAlive() 方法吗?最后,我试图避免将线程管理构建复制到 Android 操作系统中:-)

0 投票
1 回答
1858 浏览

java - ThreadPoolExecutor.CallerRunsPolicy 会抛出 RejectedExecutionException 吗?

在任何情况下ThreadPoolExecutor.CallerRunsPolicy会抛出RejectedExecutionException吗?

在我看来,该政策本身旨在防止抛出这些异常。其接口方法的 API RejectedExecutionHandler.rejectedExecution()声称它可能会抛出一个RejectedExecutionException. CallerRunsPolicy.rejectedExecution() 的 API 没有。

摘要:如果我使用 a RejectedExecutionException,是否需要明确处理a ?execute()CallerRunsPolicy

0 投票
2 回答
1660 浏览

android - 我应该如何使用 Executor 而不是 AsyncTask 或 IntentService 在 Android 上排队任务?

  1. 这是一个好的解决方案吗?

  2. 如何实施?

  3. 我应该什么时候正确关机?我在 Activity 中关闭它 onDestroy(),然后尽快重新启动我的应用程序。它导致一个java.util.concurrent.RejectedExecutionException,为什么?有人知道它的生命周期吗?

任何的想法?谢谢。

0 投票
3 回答
5959 浏览

java - 使用 Java Executor 进行多线程

我被以下问题困住了。比如说,我有一个包含 1000 个项目的请求,我想利用 Java Executor 来解决这个问题。

这里是主要方法

这是 QueryTask 类

因此,基于上面的示例,我想为请求中的每个数据创建线程池,同时运行它,并将结果添加到 VectorList。在过程结束时,我希望所有结果都已经在 Vector 列表中。

我在响应中不断得到不一致的结果。例如,如果我通过 10 个名称的请求,我只能返回 3 或 4 个,或者有时响应中什么也没有。我期待如果我通过 10,那么我会得到 10。

有谁知道是什么导致了这个问题?

任何帮助将不胜感激。

谢谢

0 投票
2 回答
576 浏览

java - 我应该限制我拥有的执行者的数量吗?

我有一个 Java 项目,我需要在其中并行运行。我和执行者一起做这件事。问题是,我需要在很多地方使用执行器。我应该倾向于传递一些执行器来完成工作(暂时忘记限制全局线程数)还是最好在我需要的地方创建执行器?

0 投票
3 回答
1290 浏览

java - “单 LIFO 执行器”/ SwingWorker

Consider a Swing application with a JList or JTable, when the selection changes a SwingWorker is started and loads related data from database and updates UI. 这工作正常,用户界面响应。

但是,如果用户正在快速更改所选行(按住键向上/向下键),我想确保最后选择的行是最后加载的行,而且我不想徒劳地查询数据库。所以我想要的是一个单线程执行器,它的后进先出队列大小=1。因此,向其提交任务会删除任何先前提交的任务,并使其一次最多执行 1 个任务,并且最多有 1 个任务等待执行。

我在 java.util.concurrent 中找不到类似的东西,所以我编写了自己的 Executor。我这样做是对的,还是我错过了并发包中的某些内容?解决方案是可以接受的还是有更好的方法来实现我想要的?

这是一个示例,展示了如何使用它:

0 投票
4 回答
807 浏览

java - 为什么当我在四核机器上使用多个线程时,这段代码看不到任何显着的性能提升?

我编写了一些 Java 代码来了解有关 Executor 框架的更多信息。

具体来说,我编写了代码来验证Collat​​z 假设- 这表示如果您将以下函数迭代地应用于任何整数,您最终会得到 1:

f(n) = ((n % 2) == 0) ? n/2 : 3*n + 1

CH 仍未得到证实,我认为这将是了解 Executor 的好方法。每个线程都被分配了一个整数范围 [l,u] 来检查。

具体来说,我的程序采用 3 个参数 - N(我要检查 CH 的数字)、RANGESIZE(线程必须处理的间隔长度)和 NTHREAD,即线程池的大小。

我的代码运行良好,但我看到的加速比我预期的要小得多——当我从 1 个线程变为 4 个线程时,速度提高了 30%。

我的逻辑是计算完全受 CPU 限制,每个子任务(检查 CH 的固定大小范围)大约需要相同的时间。

有没有人知道为什么我没有看到速度提高了 3 到 4 倍?

如果您可以在增加线程数(以及机器、JVM 和操作系统)时报告您的运行时,那也很棒。

细节

运行时:

java -d64 -server -cp 。Collat​​z 10000000 1000000 4 => 4 个线程,耗时 28412 毫秒

java -d64 -server -cp 。Collat​​z 10000000 1000000 1 => 1 个线程,耗时 38286 毫秒

处理器:

四核 Intel Q6600,2.4GHZ,4GB。机器已卸载。

爪哇:

java 版本“1.6.0_15”Java(TM) SE 运行时环境(构建 1.6.0_15-b03)Java HotSpot(TM) 64 位服务器 VM(构建 14.1-b02,混合模式)

操作系统:

Linux quad0 2.6.26-2-amd64 #1 SMP Tue Mar 9 22:29:32 UTC 2010 x86_64 GNU/Linux

代码:(我无法发布代码,我认为对于 SO 要求来说太长了,源可在Google Docs上找到

0 投票
3 回答
11777 浏览

java - ThreadPool 不按顺序运行任务

我正在使用该Executor框架Executors.newCachedThreadPool();
,我有一个Runnables 列表,例如 100。
前 50 个,每个创建一个值(存储在一个列表中)供最后 50 个使用。
我想如果我按顺序传递Runnablesexecutor.execute()它们在列表中,它们也将以相同的顺序执行。
但这并没有发生。
这些任务似乎是按随机顺序执行的,它们是交错的,而不是按顺序执行的。
这是它应该如何工作的吗?有什么办法可以解决这个问题?

谢谢