Questions tagged «executorservice»

ExecutorService是一个Java对象,其中包含托管线程池,并能够为这些线程安排提交的任务。调度策略在多种可用实施方式中有所不同。

25
如何使用ExecutorService等待所有线程完成?
我需要一次执行一些任务4,如下所示: ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } //...wait for completion somehow 完成所有步骤后如何通知我?现在,我想不出什么比设置一些全局任务计数器并在每个任务结束时减少它,然后无限循环监视此计数器为0更好的了。或获取期货的列表,并在无限循环中对所有期货进行isDone监视。什么是不涉及无限循环的更好的解决方案? 谢谢。

6
Java Timer与ExecutorService?
我有使用计划任务的代码java.util.Timer。我环顾四周,发现ExecutorService可以做到这一点。因此,这里有一个问题,您是否使用过Timer并ExecutorService安排了任务,一次使用比另一次使用有什么好处? 还想检查是否有人使用过该Timer课程并遇到任何ExecutorService为他们解决的问题。

17
命名ExecutorService的线程和线程池
假设我有一个利用该Executor框架的应用程序 Executors.newSingleThreadExecutor().submit(new Runnable(){ @Override public void run(){ // do stuff } } 当我在调试器中运行此应用程序时,将使用以下(默认)名称创建线程:Thread[pool-1-thread-1]。如您所见,这并不是非常有用,而且据我所知,该Executor框架没有提供一种简便的方法来命名已创建的线程或线程池。 那么,如何为线程/线程池提供名称呢?例如,Thread[FooPool-FooThread]。

12
处理来自Java ExecutorService任务的异常
我正在尝试使用Java的ThreadPoolExecutor类以固定数量的线程运行大量繁重的任务。每个任务都有很多地方,在这些地方可能会由于异常而失败。 我已经继承了子类,ThreadPoolExecutor并且重写了afterExecute应该提供运行任务时遇到的任何未捕获异常的方法。但是,我似乎无法使其正常工作。 例如: public class ThreadPoolErrors extends ThreadPoolExecutor { public ThreadPoolErrors() { super( 1, // core threads 1, // max threads 1, // timeout TimeUnit.MINUTES, // timeout units new LinkedBlockingQueue<Runnable>() // work queue ); } protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); if(t != null) { System.out.println("Got an …

14
ExecutorService,如何等待所有任务完成
等待所有任务ExecutorService完成的最简单方法是什么?我的任务主要是计算,因此我只想运行大量的作业-每个内核上一个。现在,我的设置如下所示: ExecutorService es = Executors.newFixedThreadPool(2); for (DataTable singleTable : uniquePhrases) { es.execute(new ComputeDTask(singleTable)); } try{ es.wait(); } catch (InterruptedException e){ e.printStackTrace(); } ComputeDTask实现可运行。这似乎是正确执行的任务,但代码崩溃上wait()用IllegalMonitorStateException。这很奇怪,因为我玩了一些玩具示例,而且看起来很奏效。 uniquePhrases包含数以万计的元素。我应该使用其他方法吗?我正在寻找尽可能简单的东西

7
在ExecutorService的提交和ExecutorService的执行之间选择
如果返回值与我无关,我应该如何在ExecutorService的 Submit或execute之间进行选择? 如果同时测试两者,则除了返回的值外,我看不到其他任何差异。 ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); threadExecutor.execute(new Task()); ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); threadExecutor.submit(new Task());


6
如何从线程池获取线程ID?
我有一个固定的线程池,我可以将任务提交给该线程池(限制为5个线程)。我如何找出这5个线程中的哪个执行我的任务(例如“ 5个线程中的第3 个线程正在执行此任务”)? ExecutorService taskExecutor = Executors.newFixedThreadPool(5); //in infinite loop: taskExecutor.execute(new MyTask()); .... private class MyTask implements Runnable { public void run() { logger.debug("Thread # XXX is doing this task");//how to get thread id? } }

13
不可能使缓存的线程池具有大小限制吗?
限制缓存线程池的创建数量似乎是不可能的。 这是在标准Java库中实现static Executors.newCachedThreadPool的方式: public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } 因此,使用该模板继续创建固定大小的缓存线程池: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>()); 现在,如果您使用它并提交3个任务,一切都会好起来的。提交任何其他任务将导致拒绝执行异常。 试试这个: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>()); 将导致所有线程按顺序执行。即,线程池将永远不会产生多个线程来处理您的任务。 这是ThreadPoolExecutor的execute方法中的错误吗?还是这是故意的?还是有其他方法? 编辑:我想要的东西完全类似于缓存的线程池(它会按需创建线程,然后在超时后将其杀死),但是它可以创建的线程数受到限制,并且一旦有线程就可以继续排队其他任务达到其线程限制。根据sjlee的答复,这是不可能的。查看ThreadPoolExecutor的execute()方法确实是不可能的。我将需要像SwingWorker一样子类化ThreadPoolExecutor并重写exe​​cute(),但是SwingWorker在execute()中所做的事情是一个完整的技巧。

3
FixedThreadPool与CachedThreadPool:两种弊端中的较小者
我有一个程序产生线程(〜5-150)来执行一堆任务。最初,我使用a,FixedThreadPool因为这个类似的问题表明它们更适合寿命更长的任务,并且由于我对多线程的了解非常有限,我认为线程的平均寿命(几分钟)是“ 寿命长 ”的。 但是,我最近添加了产生更多线程的功能,并且这样做使我超出了我设置的线程限制。在这种情况下,最好猜测并增加我可以允许的线程数,或者切换到a CachedThreadPool以便没有浪费的线程? 初步尝试将它们都尝试一下,似乎没有什么区别,所以我倾向于选择CachedThreadPool正义以避免浪费。但是,线程的寿命是否意味着我应该改而选择a FixedThreadPool并只处理未使用的线程?这个问题使得它看起来像那些额外的线程不被浪费,但我希望澄清。

9
ExecutorService在超时后中断任务
我正在寻找可以提供超时的ExecutorService实现。如果提交给ExecutorService的任务花费的时间超过了超时时间,则这些任务将被中断。实现这样的野兽并不是一个困难的任务,但是我想知道是否有人知道现有的实现。 这是我根据以下一些讨论得出的。任何意见? import java.util.List; import java.util.concurrent.*; public class TimeoutThreadPoolExecutor extends ThreadPoolExecutor { private final long timeout; private final TimeUnit timeoutUnit; private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor(); private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<Runnable, ScheduledFuture>(); public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, long timeout, TimeUnit timeoutUnit) …

5
在ExecutorService上调用shutdown()的原因
我读它颇有几分在过去的几个小时,我根本看不到任何理由(有效的理由)来调用shutdown()的ExecutorService,除非我们有一个巨大的应用程序,商店,几十个几十个不同的执行服务,不用于很长时间。 关闭(根据我的收集)唯一要做的事情是完成正常线程后所做的事情。当普通线程完成Runnable(或Callable)的run方法时,它将传递给Garbage Collection进行收集。使用Executor Service,线程将被简单地搁置,它们不会被选中以进行垃圾回收。为此,需要关机。 好,回到我的问题。有什么理由ExecutorService经常要求关机,甚至在提交某些任务后立即关机?我想抛弃有人正在做的情况,然后在awaitTermination()此之后立即调用,因为这已得到验证。一旦完成此操作,就必须重新创建一个新文件ExecutorService,以执行相同的操作。难道不是ExecutorService要重用线程的整个想法吗?那么,为什么要ExecutorService这么快就销毁呢? 简单地创建ExecutorService(或根据您需要的数量进行耦合),然后在应用程序运行期间将任务传给他们,然后在应用程序退出或其他重要阶段关闭这些执行程序,这是一种合理的方法吗? ? 我想从一些经验丰富的编码人员那里得到答案,他们确实使用ExecutorServices编写了许多异步代码。 第二个问题,与android平台的交易要小一些。如果你们中的某些人会说每次关闭执行程序都不是最好的主意,而您在android上编程,能否告诉我当我们处理不同的事件时如何处理这些关闭(具体来说-在执行时)应用程序生命周期。 基于CommonsWare的评论,我将该帖子设为中立。我真的对争论到死不感兴趣,而且看来它正在领先。我只想从经验丰富的开发人员那里了解到我在这里问的内容,如果他们愿意分享他们的经验。谢谢。

7
Java:ExecutorService在特定队列大小后会在提交时阻止
我正在尝试编写一个解决方案,其中单个线程会产生可并行执行的I / O密集型任务。每个任务都有重要的内存数据。因此,我希望能够限制当前待处理的任务数。 如果我这样创建ThreadPoolExecutor: ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(maxQueue)); 然后,当队列已满并且所有线程都已经繁忙时,executor.submit(callable)抛出该异常RejectedExecutionException。 executor.submit(callable)当队列已满并且所有线程都忙时,我该怎么做才能阻塞? 编辑:我试过了: executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); 它以某种微妙的方式达到了我想要达到的效果(基本上被拒绝的线程在调用线程中运行,因此这阻止了调用线程提交更多信息)。 编辑:(问了问题5年后) 对于阅读此问题及其答案的任何人,请勿将接受的答案作为一种正确的解决方案。请通读所有答案和评论。


8
将ExecutorService转换为Java中的守护程序
我正在Java 1.6中使用ExecutoreService,其启动方式仅由 ExecutorService pool = Executors.newFixedThreadPool(THREADS). 当我的主线程完成时(以及线程池处理的所有任务),该池将阻止我的程序关闭,直到我显式调用 pool.shutdown(); 是否可以通过某种方式将此池使用的内部线程管理转换为守护线程来避免调用此方法?还是我在这里想念什么。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.