问题标签 [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.
java - Java - Executors 有什么了不起的?
在没有 Java Executors 的生活中,必须为每个 Runnable 任务创建新线程。创建新线程需要线程开销(创建和拆除),这会增加非执行程序程序的复杂性和浪费时间。
参考代码:
没有 Java 执行器 -
使用 Java 执行器 -
底线是 Executors 抽象了如何管理线程的低级细节。
真的吗?
谢谢。
java - 如何使用 ThreadPoolExecutor 和自定义任务实现 PriorityBlockingQueue
我搜索了很多,但找不到解决我的问题的方法。
我有自己的班级,BaseTask
使用 aThreadPoolExecutor
来处理任务。我想要任务优先级,但是当我尝试使用 a 时,PriorityBlockingQueue
我得到ClassCastException
了因为ThreadPoolExecutor
它将我的任务包装到一个FutureTask
对象中。
这显然是有道理的,因为FutureTask
没有实现Comparable
,但是我将如何继续解决优先级问题?我读过你可以覆盖newTaskFor()
in ThreadPoolExecutor
,但我似乎根本找不到这种方法......?
我们欢迎所有的建议!
一些帮助的代码:
在我的BaseTask
课上,我有
在BaseFutureTask
课堂上
在BaseThreadPoolExecutor
类中,我覆盖了 3 个submit
方法......这个类中的构造函数被调用,但没有一个submit
方法
android - 多次调用 Looper 会导致“向死线程上的处理程序发送消息”
我正在使用带有我自己的 ThreadFactory 的 Executor [固定线程池],它添加了一个 Looper:
我正在运行一个发出网络请求的线程,但如果网络出现故障,我希望向用户显示一条对话框消息。这个过程相当复杂,因为它需要在 UI 线程中发出并显示请求。我可以通过简单地向网络线程添加一个循环并等待从 UI 线程发送消息来等待用户对对话框的响应。这允许我将网络请求封装在一个 while(tryAgain) 线程中。除了第二次调用 Looper.loop() 方法(显示第二个网络错误对话框之后)并且对话框(在 UI 线程中)将消息发送到网络线程的处理程序时,一切都运行良好:
在 AlertDialog 实例中是一个 OnClickListener:
我已经检查过该线程仍然处于活动状态,handler.getLooper().getThread().isAlive()
它总是返回 true,但它仍然给我“向死线程上的处理程序发送消息”。消息/处理程序如何决定线程已死?它不应该依赖 .isAlive() 方法吗?最后,我试图避免将线程管理构建复制到 Android 操作系统中:-)
java - ThreadPoolExecutor.CallerRunsPolicy 会抛出 RejectedExecutionException 吗?
在任何情况下ThreadPoolExecutor.CallerRunsPolicy会抛出RejectedExecutionException吗?
在我看来,该政策本身旨在防止抛出这些异常。其接口方法的 API RejectedExecutionHandler.rejectedExecution()声称它可能会抛出一个RejectedExecutionException
. CallerRunsPolicy.rejectedExecution() 的 API 没有。
摘要:如果我使用 a RejectedExecutionException
,是否需要明确处理a ?execute()
CallerRunsPolicy
android - 我应该如何使用 Executor 而不是 AsyncTask 或 IntentService 在 Android 上排队任务?
这是一个好的解决方案吗?
如何实施?
我应该什么时候正确关机?我在 Activity 中关闭它 onDestroy(),然后尽快重新启动我的应用程序。它导致一个
java.util.concurrent.RejectedExecutionException
,为什么?有人知道它的生命周期吗?
任何的想法?谢谢。
java - 使用 Java Executor 进行多线程
我被以下问题困住了。比如说,我有一个包含 1000 个项目的请求,我想利用 Java Executor 来解决这个问题。
这里是主要方法
这是 QueryTask 类
因此,基于上面的示例,我想为请求中的每个数据创建线程池,同时运行它,并将结果添加到 VectorList。在过程结束时,我希望所有结果都已经在 Vector 列表中。
我在响应中不断得到不一致的结果。例如,如果我通过 10 个名称的请求,我只能返回 3 或 4 个,或者有时响应中什么也没有。我期待如果我通过 10,那么我会得到 10。
有谁知道是什么导致了这个问题?
任何帮助将不胜感激。
谢谢
java - 我应该限制我拥有的执行者的数量吗?
我有一个 Java 项目,我需要在其中并行运行。我和执行者一起做这件事。问题是,我需要在很多地方使用执行器。我应该倾向于传递一些执行器来完成工作(暂时忘记限制全局线程数)还是最好在我需要的地方创建执行器?
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。我这样做是对的,还是我错过了并发包中的某些内容?解决方案是可以接受的还是有更好的方法来实现我想要的?
这是一个示例,展示了如何使用它:
java - 为什么当我在四核机器上使用多个线程时,这段代码看不到任何显着的性能提升?
我编写了一些 Java 代码来了解有关 Executor 框架的更多信息。
具体来说,我编写了代码来验证Collatz 假设- 这表示如果您将以下函数迭代地应用于任何整数,您最终会得到 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 。Collatz 10000000 1000000 4 => 4 个线程,耗时 28412 毫秒
java -d64 -server -cp 。Collatz 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上找到
java - ThreadPool 不按顺序运行任务
我正在使用该Executor
框架Executors.newCachedThreadPool();
,我有一个Runnable
s 列表,例如 100。
前 50 个,每个创建一个值(存储在一个列表中)供最后 50 个使用。
我想如果我按顺序传递Runnable
sexecutor.execute()
它们在列表中,它们也将以相同的顺序执行。
但这并没有发生。
这些任务似乎是按随机顺序执行的,它们是交错的,而不是按顺序执行的。
这是它应该如何工作的吗?有什么办法可以解决这个问题?
谢谢