Tag: threadpoolexecutor

我们是否需要关闭ExecutorService fixedThreadPool

我使用ExecutorService创建了threadpool,在我的应用程序中使用下面的代码调用供应商websrvice。 ExecutorService executor = Executors.newFixedThreadPool(getThreadPoolSize()); for (int i = 0; i < list.size(); i++) { Request ecpReq = list.get(i); thRespLst.add(executor.submit(new Task(ecpReq))); } 想要知道我们需要关注线程池或其他东西,基本上我不想在生产环境中挂线程。

newFixedThreadPool()vs newCachedThreadPool()

如果newCachedThreadPool()根据需要创建一个线程池,根据需要创建新线程,但是在它们可用时将重用先前构造的线程,而在newFixedThreadPool(int size)情况下,指定大小以创建指定大小的线程池。 为什么newFixedThreadPool(int size)不是以newCachedThreadPool()方式实现的,其中线程池仅在需要时创建新线程并将线程限制为大小? 对上述内容的任何澄清都非常有用。

具有多个线程的’N’项的进程列表

我有N项目的List ,我想在固定数量的threads之间按顺序划分此List 。 顺序我的意思是,我想传递1 to N/4到第一个thread , N/4 + 1 to N/2到第二个线程和N/2+1 to N到第三个thread ,现在一旦所有threads完成了他们的工作,我想通知主thread发送一些消息,说明所有处理都已完成。 到目前为止我所做的是我已经实现了ExecutorService 我做了这样的事 ExecutorService threadPool = Executors.newFixedThreadPool(Number_of_threads); //List of items List List itemList = getList(); for (int i = 0 i < Number_of_threads ;i++ ) { //how to divide list here sequentially and pass it to some processor while will process […]

MultiThreading与ThreadPoolExecutor

我在我写的许多应用程序中使用过multithreading。 在阅读更多内容时,我遇到了ThreadPoolExecutors 。 我无法区分这两种情况。 我仍然理解的是,当我有一项任务时,我应该使用multithreading我想将任务分成多个小任务来利用CPU并更快地完成工作。 当我设置任务时,使用ThreadPoolExecutor ,每个任务可以相互独立运行。 如果我错了,请纠正我。 谢谢

LinkedBlockingQueue put vs offer

我有一个链接阻塞队列,我在其中执行插入和删除操作。 在链接阻塞队列的情况下,我需要知道哪一个更好put或offer 。 性能参数是CPU利用率,内存和总吞吐量。 应用程序使用是实时系统,其中可以有多个传入请求和较少的线程来处理我们需要在队列中插入元素的位置。 我阅读了Java文档的put和offer,内部应用程序没有太大区别。

Java:如何从运行的线程中获取完成的线程来拾取任务

我正在使用具有不同运行时间的任务的multithreading应用程序。 当一个线程完成时,是否有办法从仍在运行的线程中接管某些任务? 这是一个例子。 我用5个线程启动程序,每个程序有50个任务。 当最快的运行线程完成时,另一个线程仍然有40个任务要完成。 如何让完成的线程从另一个线程中获取20个任务,因此每个线程继续工作20个,而不是等待正在运行的线程完成剩下的40个?

ExecutorService,按顺序执行任务但从池中获取线程

我正在尝试构建ExecutorService的实现,我们称之为SequentialPooledExecutor ,具有以下属性。 SequentialPooledExecutor所有实例共享同一个线程池 对SequentialPooledExecutor的同一实例的调用按SequentialPooledExecutor执行。 换句话说,实例在开始处理其队列中的下一个任务之前等待当前正在执行的任务的终止。 我目前正在自己​​实施SequentialPooledExecutor ,但我想知道我是否正在重新发明轮子。 我查看了ExecutorService不同实现,例如Executors类提供的那些,但我找不到符合我要求的实现。 你知道我现有的实现是否缺失,还是我应该继续自己实现界面? 编辑: 我认为我的要求不是很清楚,让我们看看我是否可以用其他的话来解释它。 假设我有一系列会话,比如1000个(我之前称之为执行程序实例的东西)。 我可以向会话提交任务,我希望保证提交给同一会话的所有任务都按顺序执行。 但是,属于不同会话的任务应该彼此没有依赖关系。 我想定义一个执行这些任务的ExecutorService ,但是使用有限数量的线程,比方说200,但确保在同一个会话中的前一个任务完成之前不启动任务。 我不知道是否存在已经存在的任何内容,或者我是否应该自己实现这样的ExecutorService 。

外部共享资源的Java并发模式(智能卡)

我有一个Web服务器服务,客户端请求智能卡计算并获得结果。 可用的智能卡号可以在服务器正常运行时间内减少或增加 ,例如,我可以从阅读器中物理添加或删除智能卡(或许多其他事件……例如exception等)。 智能卡计算可能需要一段时间,因此如果存在对Web服务器的并发请求,我必须优化这些作业以使用所有可用的智能卡。 我想过使用智能卡线程池。 至少在我看来,不寻常的是,池应该改变它的大小,而不是取决于客户端的请求,而只取决于智能卡的可用性。 我研究过很多例子: BlockingQueue :存储请求和停止线程等待某事做的好看。 FutureTask :我可以使用这个类来让客户端等待它的答案,但是哪种类型的执行者应该完成任务呢? ThreadPoolExecutor :似乎我需要什么,但有了这个我不能改变池大小,而且每个线程应该链接到一个智能卡插槽。 如果我可以更改池大小(在插入智能卡时添加线程并在删除智能卡时删除线程)以及我是否可以为每个线程分配特定智能卡,这可以是一种解决方案。 这是智能卡控制,每个智能卡有一个SmartcardWrapper,每个智能卡都有自己的插槽号。 public class SmartcardWrapper{ private int slot; public SmartcardWrapper(int slot) { this.slot=slot; } public byte[] compute(byte[] input) { byte[] out=new byte[]; SmartcardApi.computerInput(slot,input,out); //Native method return out; } } 我试图创建一个每个智能卡一个线程的线程池: private class SmartcardThread extends Thread{ protected SmartcardWrapper sw; public SmartcardThread(SmartcardWrapper sw){ this.sw=sw; […]

ThreadPoolExecutor:任务排队等待但未提交

我们有一个场景,提交给ThreadPoolExecutor的任务是长期运行的。 当线程池启动时,我们启动它,核心池大小= 5,最大池大小= 20,队列大小为10.在我们的应用程序中,大约有10个任务被提交。 大多数情况下,这些任务运行几分钟/小时然后完成。 然而,有一种情况是所有5个任务都被I / O挂起。 结果我的核心池大小达到了最大值,但我的Threadpoolexecutor队列未满。 所以额外的5个任务永远不会有机会运行。 请建议我们如何处理这种情况? 在这种情况下,有一个更小的队列更好的选择吗? 初始化threadPool时最佳队列大小是多少? 另外关于被绞死的任务,我们有什么方法可以从Threadpool中拔出线程? 在这种情况下,至少其他任务将有机会运行。

如何为CompletableFuture :: supplyAsync选择Executor

CompletableFuture::supplyAsync(() -> IO bound queries) 如何为CompletableFuture :: supplyAsync选择Executor以避免污染ForkJoinPool.commonPool() 。 Executors有很多选项( newCachedThreadPool , newWorkStealingPool , newFixedThreadPool等) 我在这里阅读了有关新ForkJoinPool的内容 如何为我的用例选择合适的一个?