草庐IT

Threadpool

全部标签

java - 如何实现 ExecutorService 来轮流执行任务?

我正在使用java.util.concurrent.ExecutorService与fixedthreadpool执行任务列表。我的任务列表通常在80-150左右,并且我已将随时运行的线程数限制为10,如下所示:ExecutorServicethreadPoolService=Executors.newFixedThreadPool(10);for(Runnabletask:myTasks){threadPoolService.submit(task);}我的用例要求即使已完成的任务也应该重新提交给ExecutorService但只有当所有已经提交的任务时才应该再次执行/获取服务/完成

java - 使用 ThreadPoolExecutor 的 Activity 任务数

我正在使用ThreadPoolExecutor在我的Java应用程序中执行任务。我有一个要求,我想在执行程序队列中的任何时间点获取队列中Activity任务的数量。我抬头看了看javadoc对于ThreadPoolExecutor并找到了两个相关方法:getTaskCount()和getCompletedTaskCount()。根据文档,我可以分别从上述两种方法中获取计划任务数和已完成任务数。但是我无法找到在任何时间点获取队列中Activity任务数的解决方案。我可以做类似的事情:getTaskCount()=getCompletedTaskCount()+failedtasks+ac

java - 修复了线程池线程阻塞,当提交了足够多的任务时

我有一个流程需要并行计算许多小任务,然后按任务的自然顺序处理结果。为此,我进行了以下设置:一个简单的ExecutorService和一个阻塞队列,当Callable提交给执行程序时,我将使用它来保持返回的Future对象:ExecutorServiceexec=Executors.newFixedThreadPool(15);LinkedBlockingQueue>futures=newLinkedBlockingQueue>(15*64);一些调试代码,用于计算提交的数量和已处理的任务数量,并定期将它们写出来(注意processed在任务代码本身的末尾递增):AtomicLongpr

java - 在 Elasticsearch 中创建 TransportClient 时限制 ThreadPool 中的线程数

我正在elasticsearch中创建一个TransportClient实例。下面是相同的代码。问题是我正在尝试减少使用TransportClient启动的线程池生成的线程数。但是我使用我的elasticsearch的任何设置总是用12个线程初始化线程池。请让我知道如何配置它以获得所需的线程。publicstaticTransportClientgetTransportClient(Stringip,intport){ImmutableSettings.Buildersettings=ImmutableSettings.settingsBuilder();settings.put("c

java - 从任务本身重新提交/安排任务 - 这是一个好习惯吗?

考虑我们有一个预定的执行程序服务:ScheduledExecutorServicethreadPool=Executors.newScheduledThreadPool(...);对于某些逻辑,我们希望重试任务执行。以下方法对我来说似乎很奇怪,但我不明白为什么:threadPool.submit(newRunnable(){@Overridepublicvoidrun(){//...if(needToBeScheduled()){threadPool.schedule(this,delay,TimeUnit.MINUTES);}elseif(needToBeResubmitted())

java - 为什么 Scala 构建自己的 ForkJoinPool 而不是使用 java.util.concurrent.ForkJoinPool#commonPool?

这个问题在这里已经有了答案:scala.concurrent.forkjoin.ForkJoinPoolvsjava.util.concurrent.ForkJoinPool(1个回答)关闭2年前。Java和Scala都引入了自己的全局ForkJoinPool,Java为java.util.concurrent.ForkJoinPool#commonPool,Scala为scala.concurrent.ExecutionContext#global。这两个似乎都旨在用于相同的用例,特别是运行非阻塞并发任务(通常是隐式的)。现在据我所知,如果你以错误的方式选择互操作依赖项,你最终会得到

java - 线程池处理 'duplicate' 任务

我想并行执行一些不同的任务,但有一个概念,即如果任务已经排队或正在处理,则不会重新排队。我已经阅读了一些关于JavaAPI的内容,并提出了下面的代码,它似乎可以工作。任何人都可以阐明我使用的方法是否是最好的方法。任何危险(线程安全?)或更好的方法来做到这一点?代码如下:importjava.util.HashMap;importjava.util.concurrent.Future;importjava.util.concurrent.LinkedBlockingQueue;importjava.util.concurrent.ThreadPoolExecutor;importjava

java - 工作/任务窃取 ThreadPoolExecutor

在我的项目中,我正在构建一个Java执行框架,用于接收来自客户的工作请求。工作(大小不一)被分解为一组任务,然后排队等待处理。有单独的队列来处理每种类型的任务,并且每个队列都与一个线程池相关联。ThreadPools的配置方式使引擎的整体性能达到最佳。这种设计有助于我们有效地平衡请求的负载,并且大请求不会最终占用系统资源。然而,有时当一些队列为空并且它们各自的线程池处于空闲状态时,解决方案会变得无效。为了让它变得更好,我正在考虑实现工作/任务窃取技术,以便负载较重的队列可以从其他线程池获得帮助。然而,这可能需要实现我自己的执行器,因为Java不允许多个队列与线程池相关联,并且不支持工作

java - Akka 如何从 ForkJoinPool 中获益?

Akkadocs声明默认调度程序是一个fork-join-executor,因为它“在大多数情况下提供出色的性能”。我想知道这是为什么?来自ForkJoinPoolAForkJoinPooldiffersfromotherkindsofExecutorServicemainlybyvirtueofemployingwork-stealing:allthreadsinthepoolattempttofindandexecutetaskssubmittedtothepooland/orcreatedbyotheractivetasks(eventuallyblockingwaitingfo

java - 即使在 Websphere 中应用程序已停止后,线程仍会继续运行

我有一个长时间运行的线程,它是使用org.springframework.scheduling.commonj.WorkManagerTaskExecutor创建的使用Spring并在WebsphereApplicationServer8中运行。问题是即使应用程序已停止,该线程仍继续运行。该线程也需要停止,但它没有发生。我什至尝试使用Thread.currentThread().isInterrupted()来检查当前线程是否被中断,但它总是返回false。因此无法通过我的代码知道线程应该继续运行还是停止。这是我对WorkManagerTaskExecutor的spring配置:线程是