问题标签 [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 回答
428 浏览

java - 使用 wait() 和 notify() 控制线程

(问题已解决,解决方案如下)
我有 2 个课程:装备和指挥。装备是运行命令的设备,但我需要它能够同时运行一个命令。命令是一个线程,它在 run() 函数上执行,而 Equip 是一个不扩展任何东西的普通类。目前我有以下设置来运行命令:

命令类:

装备等级:

但是,这是行不通的。基本上, notify() 不会唤醒命令线程,因此它永远不会执行。我搜索了等待和通知协议,但我找不到代码有什么问题。我也尝试直接从 queueCommand() 方法调用 wait() ,但随后 queueCommand 的执行停止了,它也没有做它应该做的事情。这种方法是否正确,我遗漏了什么,或者这是完全错误的,我应该实现一个 Monitor 类来操作并发线程?

编辑:感谢@Gray,我使用另一种完全不同的方法解决了这个问题,使用 Executors。

这是最终的代码,有一天它可能会对某人有所帮助:

装备等级:

private ExecutorCompletionService commandQueue = new ExecutorCompletionService(Executors.newFixedThreadPool(1));

在 Command 类中,我只有一个方法来封装设备的执行方法。当我同时需要命令的结果时使用布尔值 waitCompletion,而不是调用一个新线程来执行它,我只是执行并等待,假装它在同一个线程上执行。这个问题包含一个关于这个问题的很好的讨论:你什么时候调用java的thread.run()而不是thread.start()?. 是的,在这种情况下,调用 .run() 而不是 .start() 很有用。

0 投票
3 回答
176 浏览

java - 从 threadExecutor 返回值

如何访问固定 threadExecutor 中的 getOptimizedMol() 方法?当每个优化器线程完成时,我需要获得返回分子吗?

0 投票
2 回答
2362 浏览

java - Java的ThreadPoolExecutor如何使用自定义的ThreadFactory?

ThreadPoolExecutor 类允许提供自定义 ThreadFactory 来创建新线程。但是,我不明白这些线程是如何在 sun 的 ThreadPoolExecutor 实现中使用的。

此实现创建新线程,如下所示:

但是在 Worker 的实现中,我看不到字段“thread”是如何用作运行器的。

此外,我不明白如何为 Thread 提供可重用的自定义“运行”方法(重用的地方 - 如 ThreadPoolExecutor - 意味着“它们运行多个 Runnable”)。ThreadPoolExecutor 如何重用此类线程来运行多个 Runnable(假设 Thread 类中的“目标”Runnable 是在构造时设置的并且没有设置器)。ThreadPoolExecutor 的文档如下:

这是否意味着不使用自定义 ThreadFactory 创建的线程的“运行”方法?这是我理解“自定义线程创建+线程'重用'”机制的唯一方法。

0 投票
1 回答
94 浏览

java - 等待两个 ExecutorServices 的首选方式?

我有两个 ExecutorServices,一个用来保存生产者,另一个用来保存消费者。我正在使用 awaitTermination 方法,它是阻塞的并且需要一个超时参数。但我想在两个 ExecutorServices 上等待相同的超时。由于 awaitTermination 调用被阻塞,我不能这样做:

因为这最终会等待总共 8 个小时。我该怎么办?

0 投票
2 回答
3397 浏览

java - 对服务器套接字客户端使用 Executor 而不是新线程

我目前正在编写一个多个客户端将连接到的服务器。通信协议基本上是服务器向客户端发送任务,客户端在执行任务时响应。客户端保持与服务器的连接,并且永远不应断开连接。

目前我正在启动一个新线程来处理每个客户端。在精神上,我目前的解决方案是这样的:(来自Java Concurrency in practice 的来源)

但我想使用 Executors,因为它们看起来更稳定且可扩展性更好。因此,为了让服务器能够向客户端发送消息,我需要将客户端与运行它们的 Executor 分开跟踪。因此,如果我将客户端放在 CopyOnWriteArrayList 客户端中的位置,然后在 Server 类中有类似的内容:

这将允许我遍历 CopyOnWriteArrayList 以便向所有客户端发送命令并删除断开连接的客户端。这是一个强大的解决方案吗?如果一个可运行对象由于某种原因会传播一个异常给它,那么 Executor 会发生什么?

0 投票
3 回答
1765 浏览

java - 实践中的 Java 并发:BoundedExecutor 中的竞争条件?

BoundedExecutorJava Concurrency in Practice 一书中的实现有些奇怪。

当 Executor 中有足够多的线程排队或运行时,它应该通过阻塞提交线程来限制向 Executor 提交的任务。

这是实现(在 catch 子句中添加缺少的重新抛出之后):

当我BoundedExecutor用 anExecutors.newCachedThreadPool()和 4 来实例化 时,我希望缓存线程池实例化的线程数永远不会超过 4。但实际上,确实如此。我得到了这个小测试程序来创建多达 11 个线程:

我认为在信号量的释放和任务结束之间有一个很小的时间框架,另一个线程可以在释放线程尚未完成时获得许可并提交任务。换句话说,它有一个竞争条件。

有人可以证实这一点吗?

0 投票
3 回答
6310 浏览

java - 工作/任务窃取 ThreadPoolExecutor

在我的项目中,我正在构建一个 Java 执行框架,用于接收来自客户端的工作请求。工作(不同大小)被分解为一组任务,然后排队等待处理。有单独的队列来处理每种类型的任务,并且每个队列都与一个 ThreadPool 相关联。ThreadPools 的配置方式使得引擎的整体性能是最佳的。

这种设计有助于我们有效地对请求进行负载平衡,并且大型请求最终不会占用系统资源。但是,有时当某些队列为空并且它们各自的线程池处于空闲状态时,该解决方案变得无效。

为了更好地做到这一点,我正在考虑实施一种工作/任务窃取技术,以便负载重的队列可以从其他线程池中获得帮助。但是,这可能需要实现我自己的 Executor,因为 Java 不允许多个队列与 ThreadPool 相关联,并且不支持工作窃取概念。

阅读有关 Fork/Join 的信息,但这似乎不适合我的需求。构建此解决方案的任何建议或替代方法都可能非常有帮助。

谢谢安迪

0 投票
3 回答
558 浏览

java - Smalltalk - Can write the Java program in Smalltalk?

I am trying to convert this Java interpreter I wrote for my compiler to a Smalltalk interpreter. Is it possible? If so, what would be a good resources to look at? I am completely new to Smalltalk, looks weird to me for now. I would appreciate any help, thanks. Some more info on the program: The input would be an intermediate code file a sample of which is as below.

Intermediate code file, which computes the factorial of a number:

JavaExecutor.java Program :

}

0 投票
2 回答
4370 浏览

java - 为什么 ScheduledExecutorService.shutdown() 使用 100% 的 CPU?

我有以下简单的代码:

实际上,虽然我的真实代码比这要复杂一些,但我可以在这些行中隔离问题。代码基本上是等待10秒运行runnable然后通知主程序结束。

但是,我注意到在 10 秒内,我的一个核心以 100% 的速度使用。

如果我评论这一行:

cpu 核心也以 100% 使用,并且主程序在 Runnable 之前完成。

如果我评论这一行:

cpu 使用正确,但程序无法完成。

如果我评论前两行,则 cpu 使用正确,但主程序不会完成。

  1. 我的代码有问题吗?
  2. executor.shutdown(); 在做某种忙碌的等待,而不是仅仅禁止提交新任务吗?
  3. 或者我应该责怪JVM?

附加细节:

PS:请不要让我使用CountDownLatchnor newSingleThreadScheduledExecutor。这与我要问的问题无关。谢谢。

编辑:

这是java转储:

0 投票
1 回答
196 浏览

java - 使用不同唯一 ID 的每个线程的性能改进

问题陈述是:-

每个线程使用 1 到 1000 之间的唯一 ID,并且程序必须运行 60 分钟或更长时间,所以在那 60 分钟内,所有 ID 都可能完成,所以我需要再次重用这些 ID,

我知道几种方法,一种方法是我在 StackOverflow 的帮助下编写的下面的方法,但是当我尝试运行它时,我发现,在运行几分钟后,这个程序变得非常慢并且需要很多时间是时候在控制台上打印 ID。而且我有时也会遇到 OutOfMemory 错误。有没有更好的方法来解决这类问题?