问题标签 [executorservice]
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 - 是否建议向 ThreadPoolExecutor 的 BlockingQueue 添加任务?
ThreadPoolExecutor的 JavaDoc不清楚是否可以直接将任务添加到BlockingQueue
后备执行程序。文档说调用executor.getQueue()
“主要用于调试和监控”。
我正在ThreadPoolExecutor
用我自己的BlockingQueue
. 我保留了对队列的引用,因此可以直接向其中添加任务。返回相同的队列getQueue()
所以我假设警告getQueue()
适用于通过我的手段获得的支持队列的引用。
例子
代码的一般模式是:
queue.offer()
对比executor.execute()
据我了解,典型用途是通过executor.execute()
. 我上面示例中的方法具有阻塞队列的好处,而execute()
如果队列已满并拒绝我的任务,则会立即失败。我也喜欢提交作业与阻塞队列交互;这对我来说感觉更“纯粹”的生产者消费者。
直接将任务添加到队列的含义:我必须调用prestartAllCoreThreads()
否则没有工作线程正在运行。假设没有与执行程序的其他交互,则不会监视队列(ThreadPoolExecutor
来源检查证实了这一点)。这也意味着对于直接入队,ThreadPoolExecutor
必须另外为 > 0 个核心线程进行配置,并且不得将其配置为允许核心线程超时。
tl;博士
给定一个ThreadPoolExecutor
配置如下:
- 核心线程 > 0
- 核心线程不允许超时
- 核心线程已预先启动
- 持有对
BlockingQueue
支持执行者的引用
将任务直接添加到队列而不是调用是否可以接受executor.execute()
?
有关的
这个问题(生产者/消费者工作队列)类似,但不具体涉及直接添加到队列中。
java - 如何在Java中命名线程池的线程
我有一个使用该Executor
框架的 Java 应用程序,并且我的代码看起来像这样
protected ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(5)
我的理解是,JVM 在内部会创建一个包含 5 个线程的池。现在,当我在分析器中检查执行情况时,我会得到类似的东西thread-pool2,thread-pool3
。
Some of these thread pools are created by the server and some are created by me
,我需要一种方法来区分哪些是我创建的,哪些是服务器创建的。
我在想,如果我可以命名线程池,它应该可以解决问题,但是看不到任何允许我这样做的 API。
提前致谢。
java - 线程终止时的 Java ExecutorService 回调
我正在使用缓存线程池 ExecutorService 来运行一些异步后台任务。我已经提供了我的 ThreadFactory,它将线程分发给 ExecutorService(只要它需要它们)。我对缓存线程池的理解是,在线程空闲 60 秒后,它会被 ExecutorService 终止。
当我的线程即将终止时,我想执行一些状态清理。实现这一目标的最佳方法是什么?ExecutorService 不会轻易地提供进入线程生命周期的钩子。
我不想关闭我的 ExecutorService - 这对于在任务到来时运行任务很有用。
谢谢,
什雷亚斯
java - ScheduledExecutor服务重用
所以,假设我有以下内容ScheduledExecutorService
:
现在,exec
用于执行周期性任务(例如目录轮询等)。但是,有一个任务(即executeOnce
)执行一次,但需要延迟。所以,我选择使用exec
来执行这个任务,但是这样的设计好不好?相反,我应该创建一个newSingleThreadExecutor
,然后随后调用shutdown
吗?例如,
实施后者有什么好处吗?
java - 跟踪不同线程上传的文件
在 java 中,我正在尝试编写一个 FileManager,它包含一个文件目录并根据请求将它们上传到其他 FileManager。每次上传请求进入(通过 Socket)时,都会创建一个新线程来处理所请求文件的上传。
我正在考虑使用 anExecutorService
和 aFileUploader implements Runnable
来处理这个问题。
即,如果 session 是 ExecutorService 并且 mySocket 是 FileManager 正在侦听请求的套接字,则每个线程的创建将类似于:
问题在于,如果 FileManager 收到重命名其数据库中的文件的命令,它需要等待当前正在上传文件的所有线程完成,然后才能重命名文件。
所以问题是,我如何跟踪有多少/哪些线程正在上传给定文件?
java - Java:强制停止 ExecutorService 线程
我的代码:
但有时 torrent 下载需要未知的时间价值,并且 « awaitTermination
» 不能按我的意愿工作。我需要在半小时后立即停止所有执行的线程,但据我所知« awaitTermination
» 只使用interrupt()
仅在循环或等待中有效的方法。因此,如果这一刻发生,超时将不起作用。那么,怎么做?
java - Java固定线程池和调度线程池的区别
我有一个固定的线程池,可以随时运行 7 个并发线程(带有一个队列),我想把它变成一个调度线程池,它只运行 7 个并发作业,但可以排队/调度更多。
阅读文档并没有真正帮助我..
公共静态 ExecutorService newFixedThreadPool(int nThreads)
创建一个线程池,该线程池重用一组固定的线程,这些线程在共享无界队列中运行。如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,新的线程将取代它。
参数:nThreads - 池中的线程数返回:新创建的线程池
公共静态 ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个线程池,可以安排命令在给定延迟后运行,或定期执行。
参数: corePoolSize - 保留在池中的线程数,即使它们是空闲的。返回:一个新创建的调度线程池
我不明白的是, corePoolSize 和 nThreads 是一回事吗?调度线程池真的是固定线程池的子集吗,也就是说我可以将调度线程池用作可以对延迟任务进行排队的固定线程池?
java - ExecutorService 的线程和线程池命名
假设我有一个使用Executor
框架的应用程序
当我在调试器中运行此应用程序时,会使用以下(默认)名称创建一个线程:Thread[pool-1-thread-1]
. 如您所见,这并不是非常有用,据我所知,该Executor
框架没有提供一种简单的方法来命名创建的线程或线程池。
那么,如何为线程/线程池提供名称呢?例如,Thread[FooPool-FooThread]
.
java - 如何更改 ExecutorService 中的线程名称?
我正在使用 ExecutorService 来执行一些 Callables,但线程的名称类似于 fixed-pool-1-thread-1。
如何更改线程的名称?如果不可能,还有另一种执行 Callables 的方法,我可以设置 threadS 的名称吗?
java - Java ScheduledThreadPool 多线程在一段时间后停止
我正在开发一个 J2SE 应用程序,它可以同步存储在不同服务器上的四个数据库中的 184 辆汽车的 GPS 信息。我为每辆车创建一个线程并存储在 ScheduledThreadPool
经纬度信息由 XML 数据中的 SocketServer 检索,因此在 SyncThread 类中,我实例化了一个 Socket 并询问信息并关闭该连接,并每 15 分钟进行一次......
该应用程序由于某种原因开始运行良好,有时会停止运行,没有异常......
jar 作为 Windows 服务运行。