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

java - Java 执行器:当任务完成时,如何在不阻塞的情况下得到通知?

假设我有一个充满任务的队列,我需要将这些任务提交给执行器服务。我希望他们一次处理一个。我能想到的最简单的方法是:

  1. 从队列中获取任务
  2. 提交给执行人
  3. 在返回的 Future 上调用 .get 并阻塞,直到有结果可用
  4. 从队列中获取另一个任务...

但是,我试图完全避免阻塞。如果我有 10,000 个这样的队列,它们需要一次处理一个任务,我将用完堆栈空间,因为它们中的大多数将保留阻塞的线程。

我想要的是提交一个任务并提供一个在任务完成时调用的回调。我将使用该回调通知作为发送下一个任务的标志。(functionaljava 和 jetlang 显然使用了这样的非阻塞算法,但我看不懂他们的代码)

如果不编写自己的执行程序服务,我该如何使用 JDK 的 java.util.concurrent 来做到这一点?

(为我提供这些任务的队列本身可能会阻塞,但这是稍后要解决的问题)

0 投票
1 回答
91699 浏览

java - 任何带有 TaskExecutor 示例的好的 Spring 线程?

我试图了解如何在使用 Spring 进行事务管理的 Java 应用程序中实现线程。我在Spring 文档中找到了 TaskExecutor 部分,而 ThreadPoolTask​​Executor 看起来很适合我的需要;

线程池任务执行器

此实现只能在 Java 5 环境中使用,但也是该环境中最常用的实现。它公开了用于配置 java.util.concurrent.ThreadPoolExecutor 的 bean 属性并将其包装在 TaskExecutor 中。如果您需要高级的东西,例如 ScheduledThreadPoolExecutor,建议您改用 ConcurrentTaskExecutor。

但是我不知道如何使用它。我一直在寻找很好的例子,但没有运气。如果有人可以帮助我,我将不胜感激。

0 投票
1 回答
1484 浏览

java - ThreadPool 是 Executor 就像 Polling 一样?

Java 的 Executor 是(据我所知)对 ThreadPool 概念的抽象——可以接受和执行(执行)任务的东西。

我正在为 Polling 概念寻找类似的例外。我需要不断地从特定队列(未实现 BlockingQueue)中轮询(出列)项目,执行它们并休眠,然后重复所有这些直到关闭。

有现成的抽象还是我应该自己写一些东西?

(欢迎提出更好的标题)

0 投票
7 回答
28290 浏览

java - 我们什么时候应该使用 Java 的 Thread over Executor?

Executor 看起来像是一个干净的抽象。您什么时候想直接使用 Thread 而不是依赖更强大的执行器?

0 投票
3 回答
12506 浏览

java - Java中的执行器和守护程序

我有一个 MyThread 对象,当我的应用程序通过服务器加载时我会实例化它,我将它标记为守护线程,然后调用start()它。只要应用程序处于活动状态,该线程就会坐下来等待来自队列的信息。我的问题/问题是:目前 MyThread 正在扩展 Thread,因为我将其标记为守护进程,并且我阅读了有关实现 Runnable 和使用 Executors 的更多信息。所以我想问的是 MyThread 是否会实现 Runnable 而不是扩展 Thread(当然会被重命名),我将使用newSingleThreadScheduledExecutor()如何、什么或在哪里将某些东西标记为守护进程。我希望我没有把术语弄得一团糟,如果我有的话,请原谅我,因为多线程环境的某些部分对我来说是非常新的。

谢谢伊泰

更新:我在我的应用程序中所指的模块是一个网络应用程序,它实际上有一些此类线程,它们的共同点是ServletContext由于各种原因它们都作为成员。目前,我将其扩展Thread为memebr,所有子类都可以使用它。如果我使用 Executor 和 ThreadFactory 切换到 Runnable 范式,那么基本上我需要一个丑陋的混合实现,并且将.作为公共成员,并且除了. 我不确定什么是最好的。谢谢WebThreadServletContextWebRunnableRunnableServletContextThreadFactorynewThread(WebRunnable arg0)newThread(Runnable arg0)

0 投票
1 回答
906 浏览

java - Java Scheduled Executor:如果任务尚未完成,是否保证不并行运行

有谁知道 java.util.concurrent 包中是否有以下 java 方法ScheduledExecutorService.html#scheduleAtFixedRate()

绝对保证,如果“最后”运行的可运行对象尚未完成,则 Runnable 计划将永远不会并行运行:

例如(伪代码)

非常感谢简

0 投票
4 回答
17250 浏览

java - Java 计划执行程序的未处理异常

我有以下问题,我想知道到底发生了什么。我使用 Java 的ScheduledExecutorService每五分钟运行一次任务。它工作得很好。Executors 彻底改变了我在 Java 中进行线程编程的方式。

现在,我浏览了 Java Doc 以获取有关在计划任务因未处理的异常而失败但找不到任何东西的情况下的行为的信息。

下一个计划任务还会运行吗?如果有未处理的异常,被调度的executor停止调度任务?谁能指出有关这个简单问题的信息?

非常感谢。

0 投票
10 回答
25498 浏览

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

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

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

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

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

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

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

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

0 投票
5 回答
20709 浏览

java - 如何从 Executors 中正确捕获 RuntimeExceptions?

假设我有以下代码:

现在,如果myRunnable抛出 a RuntimeExcpetion,我怎么能抓住它?一种方法是提供我自己的ThreadFactory实现newSingleThreadExecutor()并为从中产生的 s 设置自定义uncaughtExceptionHandlers Thread。另一种方法是包装到包含 try-catch 块myRunnable的本地(匿名) 。Runnable也许还有其他类似的解决方法。但是……总觉得这很脏,我觉得不应该这么复杂。有干净的解决方案吗?

0 投票
4 回答
10731 浏览

java - 等待 Executor 中的所有线程完成?

我正在实施并行快速排序作为编程实践,完成后,我阅读了 Executors 上的 Java 教程页面,听起来它们可以让我的代码更快。不幸的是,我依靠 join() 来确保程序在所有内容都排序之前不会继续。现在我正在使用:

这似乎工作正常,但如果我在调用我的非递归 quicksort() 方法后立即运行 e.shutdown(),它有一堆 RejectedExecutionExceptions,所以我认为这不像我想要的那样工作。

所以无论如何,我基本上试图获得与 leftThread.join() 相同的功能,但使用 Executor,我的问题是:

这是等待所有线程完成的最佳方法吗?

编辑:好的,所以我弄清楚了为什么我在关闭我的执行程序后出现了一堆错误,这是因为我在循环中调用这个函数(以平衡运行时间)而不是创建一个新的执行程序。