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

java - Java:它创建的计时器和线程

我有这个问题:

我有一个计时器。使用 scheduleAtFixedRate 它创建一个新的 Timer 任务。在那个计时器任务中有一些代码,可能需要一段时间才能完成。当前一个任务尚未完成时,如何确保 Timer 不会创建新任务?

谢谢

0 投票
3 回答
10680 浏览

java - Java:SingleThreadScheduledExecutor & java.util.concurrent.RejectedExecutionException

我有这个问题,我有

以及每 50 毫秒创建一次的任务:

myTask有时需要一段时间才能完成(比如 2-3 秒左右),但 newSingleThreadScheduledExecutor 保证下一个计划的 myTask 将等到当前的完成。

但是,我不时收到此错误:

执行:java.util.concurrent.RejectedExecutionException

我该怎么办?谢谢

0 投票
17 回答
61299 浏览

java - ThreadPoolExecutor 的 submit() 方法饱和后如何阻塞?

我想创建一个ThreadPoolExecutor这样,当它达到最大大小并且队列已满时,该submit()方法会在尝试添加新任务时阻塞。我是否需要为此实现自定义RejectedExecutionHandler,或者是否有使用标准 Java 库执行此操作的现有方法?

0 投票
4 回答
24317 浏览

java - 应该永远运行的任务的 Java Executor 最佳实践

我正在开发一个需要异步运行多个任务的 Java 项目。我被引导相信 Executor 是我做到这一点的最佳方式,所以我正在熟悉它。(是的,学习是有报酬的!)但是,我不清楚什么是完成我想做的事情的最佳方法。

为了争论,假设我有两个任务正在运行。两者都不会终止,并且两者都应该在应用程序的生命周期内运行。我正在尝试编写一个主包装类,以便:

  • 如果任一任务抛出异常,包装器将捕获它并重新启动任务。
  • 如果任一任务运行完成,包装器将注意到并重新启动任务。

现在,应该注意的是,这两个任务的实现都会将代码包装run()在一个永远不会运行到完成的无限循环中,并使用一个 try/catch 块来处理所有运行时异常而不会中断循环。我试图增加另一层确定性;如果我或跟随我的人做了一些愚蠢的事情,破坏了这些保护措施并停止了任务,应用程序需要做出适当的反应。

有没有比我更有经验的人推荐的解决这个问题的最佳实践?

FWIW,我已经启动了这个测试类:

它以我想要的方式运行,但我不知道是否有任何陷阱、效率低下或完全错误的想法等着让我大吃一惊。(事实上​​,鉴于我是新手,如果没有什么问题/不明智的话,我会感到震惊。)

欢迎任何见解。

0 投票
2 回答
26899 浏览

java - 优雅地为 ExecutorServices 实现队列长度指示器

为什么,哦,为什么不java.util.concurrent为其ExecutorServices 提供队列长度指示器?最近我发现自己在做这样的事情:

哪个工作正常,但是...我认为这确实应该作为ExecutorService. 携带与实际队列分离的计数器是愚蠢且容易出错的,计数器应该指示其长度(让我想起 C 数组)。但是,ExecutorServices 是通过静态工厂方法获得的,因此无法简单地扩展原本出色的单线程执行器并添加队列计数器。所以我该怎么做:

  1. 重新发明已经在 J​​DK 中实现的东西?
  2. 其他聪明的解决方案?
0 投票
1 回答
313 浏览

java - 这需要显式同步吗?

我有两个线程,我想确保我在 LinkedBlockingQueue 上正确地进行同步。这是正确的吗?还是不需要在 (messageToCommsQueue) 上进行显式同步?

宣言:

方法一:

方法二:

0 投票
8 回答
48967 浏览

java - Java Executors:如何设置任务优先级?

是否可以为执行者执行的任务设置优先级?我在 JCIP 中找到了一些关于它可能的声明,但我找不到任何示例,也找不到任何相关的文档。

来自 JCIP:

执行策略指定任务执行的“内容、地点、时间和方式”,包括:

  • ...
  • 任务应该按什么顺序执行(FIFO、LIFO、优先顺序)?
  • ...

UPD:我意识到我问的并不完全是我想问的。我真正想要的是:

如何使用/模拟设置线程优先级(即是什么thread.setPriority())与执行程序框架?

0 投票
2 回答
4619 浏览

java - ScheduledExecutorService 生命周期?

我有一个对象需要在对象本身还活着的时候定期做一些工作,所以我设计了类似下面的东西。基本上是一个 Main 类,其中包含对 ScheduledExecutorService 实例的引用。在此示例中,所有定期工作是将字符串打印到 std。

我希望代码的行为如下:

  1. test2 被调用,它创建了一个 Main 对象 o1(其中有一个 ScheduledExecutorService)。
  2. test2 寄存器在 o1 上每秒打印一行。
  3. test2 返回,o1 变成垃圾。
  4. 系统 gc 启动到 gc o1,它有一个 finalize 方法来关闭它的本地调度程序。

但是,如果我运行这个程序,会发生什么,它将永远持续下去。基本上 gc 永远不会调用 o1 的终结器,因此调度程序永远不会关闭,因此即使主线程结束,程序仍然不会退出。

现在,如果我在 test2() 中注释掉 o1.register,程序的行为就像它应该的那样,例如调用 gc 等。此外,在调试器中,似乎只有在调用 ScheduledExecutorService.schedule 之后才会创建实际线程。

任何解释发生了什么?

}

0 投票
4 回答
6060 浏览

java - ThreadPoolExecutor 策略

我正在尝试使用 ThreadPoolExecutor 来安排任务,但在其策略上遇到了一些问题。这是其声明的行为:

  1. 如果运行的线程少于 corePoolSize,则 Executor 总是更喜欢添加新线程而不是排队。
  2. 如果 corePoolSize 或更多线程正在运行,Executor 总是更喜欢排队请求而不是添加新线程。
  3. 如果请求无法排队,则会创建一个新线程,除非这将超过 maximumPoolSize,在这种情况下,该任务将被拒绝。

我想要的行为是这样的:

  1. 和上面一样
  2. 如果超过 corePoolSize 但小于 maximumPoolSize 线程正在运行,则更喜欢添加新线程而不是排队,并且使用空闲线程而不是添加新线程。
  3. 和上面一样

基本上我不希望任何任务被拒绝;我希望他们在无界队列中排队。但我确实希望拥有最多 maximumPoolSize 线程。如果我使用无界队列,它在达到 coreSize 后永远不会生成线程。如果我使用有界队列,它会拒绝任务。有没有办法解决?

我现在正在考虑的是在 SynchronousQueue 上运行 ThreadPoolExecutor,但不直接将任务提供给它 - 而是将它们提供给单独的无界 LinkedBlockingQueue。然后另一个线程从 LinkedBlockingQueue 提供给 Executor,如果一个被拒绝,它会再次尝试,直到它没有被拒绝。不过,这似乎是一种痛苦和一种黑客行为 - 有没有更清洁的方法来做到这一点?

0 投票
8 回答
61224 浏览

java - 队列满时ThreadPoolExecutor阻塞?

我正在尝试使用 ThreadPoolExecutor 执行大量任务。下面是一个假设的例子:

问题是我很快就得到了一个,java.util.concurrent.RejectedExecutionException因为任务的数量超过了工作队列的大小。但是,我正在寻找的期望行为是让主线程阻塞,直到队列中有空间。实现这一目标的最佳方法是什么?