我试图编写一个解决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。 请阅读所有的答案和评论。
所以我有一个程序,产生线程(〜5-150),执行一堆任务。 最初我使用了一个FixedThreadPool因为这个类似的问题表明它们更适合更长寿命的任务,而且由于我对multithreading的知识非常有限,所以我认为线程的平均寿命(几分钟)“ 长寿 ”。 不过,我最近添加了产生额外线程的function,这样做使我超出了我设置的线程限制。 在这种情况下,是否会更好地猜测和增加我可以允许的线程数或切换到CachedThreadPool所以我没有浪费线程? 初步尝试它们,似乎没有什么区别,所以我倾向于使用CachedThreadPool来避免浪费。 然而,线程的寿命是否意味着我应该select一个FixedThreadPool并只处理未使用的线程? 这个问题看起来好像那些额外的线程没有被浪费,但是我希望澄清。
斯卡拉的期货线程池有多大? 我的Scala应用程序创造了数百万的future {} ,我想知道是否有任何事情可以通过configuration线程池来优化它们。 谢谢。
我有一个固定的线程池,我提交任务(限于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? } }
在Spring Web应用程序中,我有几个DAO和服务层bean。 一个服务层bean注释了@Async / @Scheduled方法。 这些方法依赖于其他(自动布线)的bean。 我已经在XML中configuration了两个线程池: <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="2" /> <property name="maxPoolSize" value="5" /> <property name="queueCapacity" value="5" /> <property name="waitForTasksToCompleteOnShutdown" value="true" /> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/> </property> </bean> <bean id="taskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"> <property name="poolSize" value="10" /> <property name="waitForTasksToCompleteOnShutdown" value="true" /> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/> </property> </bean> <task:annotation-driven executor="taskExecutor" scheduler="taskScheduler"/> 一切都按预期工作。 我的问题是,我不能得到任务池的干净closures工作。 这些任务在数据库和文件系统上运行。 […]
相关问题 : 关于C ++ 11: C + + 11:std ::线程池? C ++ 11中的async(launch :: async)是否会使线程池过时,以避免昂贵的线程创build? 关于Boost: C ++ boost线程重用线程 boost ::线程并创build它们的池! 我如何获得一个线程池来发送任务 ,而不是一遍又一遍地创build和删除它们? 这意味着持久线程不join就重新同步。 我有这样的代码: namespace { std::vector<std::thread> workers; int total = 4; int arr[4] = {0}; void each_thread_does(int i) { arr[i] += 2; } } int main(int argc, char *argv[]) { for (int i […]
比方说,我有一个使用Executor框架的应用程序 Executors.newSingleThreadExecutor().submit(new Runnable(){ @Override public void run(){ // do stuff } } 当我在debugging器中运行这个应用程序时,将使用以下(默认)名称创build一个线程: Thread[pool-1-thread-1] 。 正如你所看到的,这不是非常有用的,据我所知, Executor框架不提供一个简单的方法来命名创build的线程或线程池。 那么,如何为线程/线程池提供名称呢? 比如Thread[FooPool-FooThread] 。
使用新线程和使用线程池中的线程有什么区别? 有什么性能优势,为什么我应该考虑使用池中的线程,而不是我明确创build的线程? 我在这里专门讨论.NET,但一般的例子都很好。
等待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包含数以万计的元素。 我应该使用另一种方法吗? 我正在寻找尽可能简单的事情