Tag: executorservice

ExectuorService与ThreadPoolExecutor(使用LinkedBlockingQueue)

我正在开发一个Multithreaded项目,在该项目中,我需要生成多个线程来测量我的客户端代码的端到端性能,因为我正在进行负载和性能testing。 所以我创build了下面使用ExecutorService代码 – 下面是使用ExecutorService的代码 – public class MultithreadingExample { public static void main(String[] args) throws InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(20); for (int i = 0; i < 100; i++) { executor.submit(new NewTask()); } executor.shutdown(); executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); } } class NewTask implements Runnable { @Override public void run() { //Measure the end to end latency […]

Future和FutureTask在Java中有什么区别?

由于使用ExecutorService可以submit一个Callable任务并返回一个Future ,为什么需要使用FutureTask来包装Callable任务并使用方法execute ? 我觉得他们都做同样的事情。

当队列满时ThreadPoolExecutor块?

我正在尝试使用ThreadPoolExecutor执行大量的任务。 以下是一个假设的例子: def workQueue = new ArrayBlockingQueue<Runnable>(3, false) def threadPoolExecutor = new ThreadPoolExecutor(3, 3, 1L, TimeUnit.HOURS, workQueue) for(int i = 0; i < 100000; i++) threadPoolExecutor.execute(runnable) 问题是我很快得到java.util.concurrent.RejectedExecutionException,因为任务的数量超过了工作队列的大小。 但是,我期望的行为是让主线程阻塞,直到队列中有空间。 什么是完成这个最好的方法?

在ExecutorService上调用shutdown()的原因

在过去的几个小时里,我读了很多关于这方面的知识,我根本看不出任何理由(有效的理由)在ExecutorService上调用shutdown(),除非我们有一个庞大的应用程序来存储几十个不同的执行程序服务长时间不使用。 唯一的(从我收集的)关机,是做一个正常的线程一旦完成。 当正常的线程完成Runnable(或Callable)的运行方法时,它将被传递给垃圾收集器进行收集。 使用Executor服务,线程将被暂时搁置,不会为垃圾收集打勾。 为此,需要关机。 回到我的问题。 有没有任何理由经常调用ExecutorService的closures,甚至在提交给它一些任务之后? 我想留下案件有人正在做这件事,并在此之后,呼吁awaitTermination(),因为这是validation。 一旦我们这样做了,我们不得不重新创build一个新的ExecutorService来做同样的事情。 ExecutorService是不是重复使用线程的想法? 那么为什么要尽快销毁ExecutorService? 是不是一个理性的方式来简单地创buildExecutorService(或者取决于你需要多less个),然后在应用程序运行期间向他们传递任务,然后在应用程序出口或其他重要阶段closures这些任务遗嘱执行人? 我想回答一些使用ExecutorServices编写大量asynchronous代码的经验丰富的编程人员。 第二方面的问题,比较小的处理android平台。 如果你们中的一些人会说,每次closures执行程序并不是最好的想法,并且你在android上编程,你能告诉我,当我们处理不同的事件时,你们如何处理这些closures(具体来说,当你执行它们时)应用生命周期。 由于CommonsWare的评论,我使这个职位保持中立。 我真的没有兴趣争论死亡,似乎是在那里领先。 如果他们愿意分享他们的经验,我只想了解我从有经验的开发人员那里得到的问题。 谢谢。

在Java中将ExecutorService转换为守护进程

我正在使用Java 1.6中的ExecutoreService,简单地通过 ExecutorService pool = Executors.newFixedThreadPool(THREADS). 当我的主线程完成时(以及线程池处理的所有任务),该池将阻止我的程序closures,直到我明确地调用 pool.shutdown(); 我可以避免必须通过某种方式调用此池pipe理的内部线程变成deamon线程吗? 还是我在这里错过了一些东西。

Java:在特定队列大小后阻止提交的ExecutorService

我试图编写一个解决scheme,在这个解决scheme中,一个线程产生可以并行执行的I / O密集型任务。 每个任务都有重要的内存数据。 所以我希望能够限制暂时的任务数量。 如果我这样创buildThreadPoolExecutor: 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年后提问) 对于阅读这个问题及其答案的任何人,请不要把接受的答案作为一个正确的解决scheme。 请阅读所有的答案和评论。

FixedThreadPool vs CachedThreadPool:两个邪恶中较小的一个

所以我有一个程序,产生线程(〜5-150),执行一堆任务。 最初我使用了一个FixedThreadPool因为这个类似的问题表明它们更适合更长寿命的任务,而且由于我对multithreading的知识非常有限,所以我认为线程的平均寿命(几分钟)“ 长寿 ”。 不过,我最近添加了产生额外线程的function,这样做使我超出了我设置的线程限制。 在这种情况下,是否会更好地猜测和增加我可以允许的线程数或切换到CachedThreadPool所以我没有浪费线程? 初步尝试它们,似乎没有什么区别,所以我倾向于使用CachedThreadPool来避免浪费。 然而,线程的寿命是否意味着我应该select一个FixedThreadPool并只处理未使用的线程? 这个问题看起来好像那些额外的线程没有被浪费,但是我希望澄清。

Executors.newCachedThreadPool()与Executors.newFixedThreadPool()

newCachedThreadPool()与newFixedThreadPool() 我应该什么时候使用其中一个? 哪种策略在资源利用方面更好?

如何从线程池获取线程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? } }

不可能做一个大小限制的caching线程池?

看起来不可能创build一个caching的线程池,它可以创build一个线程数量的限制。 下面是在标准Java库中实现的静态Executors.newCachedThreadPool: public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } 所以,使用该模板继续创build一个固定大小的caching线程池: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>()); 现在,如果你使用这个,并提交3个任务,一切都会好的。 提交任何进一步的任务将导致被拒绝的执行exception。 尝试这个: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>()); 将导致所有线程顺序执行。 也就是说,线程池将永远不会使多个线程来处理您的任务。 这是ThreadPoolExecutor的执行方法中的一个错误? 或者也许这是故意的? 或者有其他的方法? 编辑:我想要的东西就像caching线程池(它创build线程按需,然后在一定的时间后杀死它们),但它可以创build的线程数量的限制,并能够继续排队附加任务打到它的线程限制。 根据sjlee的回答,这是不可能的。 看看ThreadPoolExecutor的execute()方法确实是不可能的。 我需要inheritanceThreadPoolExecutor并像SwingWorker那样重写exe​​cute(),但是SwingWorker在其execute()方法中做了什么是一个彻底的破解。