问题标签 [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:它创建的计时器和线程
我有这个问题:
我有一个计时器。使用 scheduleAtFixedRate 它创建一个新的 Timer 任务。在那个计时器任务中有一些代码,可能需要一段时间才能完成。当前一个任务尚未完成时,如何确保 Timer 不会创建新任务?
谢谢
java - Java:SingleThreadScheduledExecutor & java.util.concurrent.RejectedExecutionException
我有这个问题,我有
以及每 50 毫秒创建一次的任务:
myTask
有时需要一段时间才能完成(比如 2-3 秒左右),但 newSingleThreadScheduledExecutor 保证下一个计划的 myTask 将等到当前的完成。
但是,我不时收到此错误:
执行:java.util.concurrent.RejectedExecutionException
我该怎么办?谢谢
java - ThreadPoolExecutor 的 submit() 方法饱和后如何阻塞?
我想创建一个ThreadPoolExecutor
这样,当它达到最大大小并且队列已满时,该submit()
方法会在尝试添加新任务时阻塞。我是否需要为此实现自定义RejectedExecutionHandler
,或者是否有使用标准 Java 库执行此操作的现有方法?
java - 应该永远运行的任务的 Java Executor 最佳实践
我正在开发一个需要异步运行多个任务的 Java 项目。我被引导相信 Executor 是我做到这一点的最佳方式,所以我正在熟悉它。(是的,学习是有报酬的!)但是,我不清楚什么是完成我想做的事情的最佳方法。
为了争论,假设我有两个任务正在运行。两者都不会终止,并且两者都应该在应用程序的生命周期内运行。我正在尝试编写一个主包装类,以便:
- 如果任一任务抛出异常,包装器将捕获它并重新启动任务。
- 如果任一任务运行完成,包装器将注意到并重新启动任务。
现在,应该注意的是,这两个任务的实现都会将代码包装run()
在一个永远不会运行到完成的无限循环中,并使用一个 try/catch 块来处理所有运行时异常而不会中断循环。我试图增加另一层确定性;如果我或跟随我的人做了一些愚蠢的事情,破坏了这些保护措施并停止了任务,应用程序需要做出适当的反应。
有没有比我更有经验的人推荐的解决这个问题的最佳实践?
FWIW,我已经启动了这个测试类:
它以我想要的方式运行,但我不知道是否有任何陷阱、效率低下或完全错误的想法等着让我大吃一惊。(事实上,鉴于我是新手,如果没有什么问题/不明智的话,我会感到震惊。)
欢迎任何见解。
java - 优雅地为 ExecutorServices 实现队列长度指示器
为什么,哦,为什么不java.util.concurrent
为其ExecutorService
s 提供队列长度指示器?最近我发现自己在做这样的事情:
哪个工作正常,但是...我认为这确实应该作为ExecutorService
. 携带与实际队列分离的计数器是愚蠢且容易出错的,计数器应该指示其长度(让我想起 C 数组)。但是,ExecutorService
s 是通过静态工厂方法获得的,因此无法简单地扩展原本出色的单线程执行器并添加队列计数器。所以我该怎么做:
- 重新发明已经在 JDK 中实现的东西?
- 其他聪明的解决方案?
java - 这需要显式同步吗?
我有两个线程,我想确保我在 LinkedBlockingQueue 上正确地进行同步。这是正确的吗?还是不需要在 (messageToCommsQueue) 上进行显式同步?
宣言:
方法一:
方法二:
java - Java Executors:如何设置任务优先级?
是否可以为执行者执行的任务设置优先级?我在 JCIP 中找到了一些关于它可能的声明,但我找不到任何示例,也找不到任何相关的文档。
来自 JCIP:
执行策略指定任务执行的“内容、地点、时间和方式”,包括:
- ...
- 任务应该按什么顺序执行(FIFO、LIFO、优先顺序)?
- ...
UPD:我意识到我问的并不完全是我想问的。我真正想要的是:
如何使用/模拟设置线程优先级(即是什么thread.setPriority()
)与执行程序框架?
java - ScheduledExecutorService 生命周期?
我有一个对象需要在对象本身还活着的时候定期做一些工作,所以我设计了类似下面的东西。基本上是一个 Main 类,其中包含对 ScheduledExecutorService 实例的引用。在此示例中,所有定期工作是将字符串打印到 std。
我希望代码的行为如下:
- test2 被调用,它创建了一个 Main 对象 o1(其中有一个 ScheduledExecutorService)。
- test2 寄存器在 o1 上每秒打印一行。
- test2 返回,o1 变成垃圾。
- 系统 gc 启动到 gc o1,它有一个 finalize 方法来关闭它的本地调度程序。
但是,如果我运行这个程序,会发生什么,它将永远持续下去。基本上 gc 永远不会调用 o1 的终结器,因此调度程序永远不会关闭,因此即使主线程结束,程序仍然不会退出。
现在,如果我在 test2() 中注释掉 o1.register,程序的行为就像它应该的那样,例如调用 gc 等。此外,在调试器中,似乎只有在调用 ScheduledExecutorService.schedule 之后才会创建实际线程。
任何解释发生了什么?
}
java - ThreadPoolExecutor 策略
我正在尝试使用 ThreadPoolExecutor 来安排任务,但在其策略上遇到了一些问题。这是其声明的行为:
- 如果运行的线程少于 corePoolSize,则 Executor 总是更喜欢添加新线程而不是排队。
- 如果 corePoolSize 或更多线程正在运行,Executor 总是更喜欢排队请求而不是添加新线程。
- 如果请求无法排队,则会创建一个新线程,除非这将超过 maximumPoolSize,在这种情况下,该任务将被拒绝。
我想要的行为是这样的:
- 和上面一样
- 如果超过 corePoolSize 但小于 maximumPoolSize 线程正在运行,则更喜欢添加新线程而不是排队,并且使用空闲线程而不是添加新线程。
- 和上面一样
基本上我不希望任何任务被拒绝;我希望他们在无界队列中排队。但我确实希望拥有最多 maximumPoolSize 线程。如果我使用无界队列,它在达到 coreSize 后永远不会生成线程。如果我使用有界队列,它会拒绝任务。有没有办法解决?
我现在正在考虑的是在 SynchronousQueue 上运行 ThreadPoolExecutor,但不直接将任务提供给它 - 而是将它们提供给单独的无界 LinkedBlockingQueue。然后另一个线程从 LinkedBlockingQueue 提供给 Executor,如果一个被拒绝,它会再次尝试,直到它没有被拒绝。不过,这似乎是一种痛苦和一种黑客行为 - 有没有更清洁的方法来做到这一点?
java - 队列满时ThreadPoolExecutor阻塞?
我正在尝试使用 ThreadPoolExecutor 执行大量任务。下面是一个假设的例子:
问题是我很快就得到了一个,java.util.concurrent.RejectedExecutionException
因为任务的数量超过了工作队列的大小。但是,我正在寻找的期望行为是让主线程阻塞,直到队列中有空间。实现这一目标的最佳方法是什么?