Questions tagged «threadpoolexecutor»

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 …


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()中所做的事情是一个完整的技巧。


9
如何在排队之前让ThreadPoolExecutor将线程增加到最大数量?
我一直对默认行为ThreadPoolExecutor支持ExecutorService很多人使用的线程池感到沮丧。引用Javadocs: 如果运行的线程数量超过corePoolSize但少于maximumPoolSize,则仅在队列已满时才创建新线程。 这意味着,如果使用以下代码定义线程池,则它将永远不会启动第二个线程,因为该线程LinkedBlockingQueue是无界的。 ExecutorService threadPool = new ThreadPoolExecutor(1 /*core*/, 50 /*max*/, 60 /*timeout*/, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(/* unlimited queue */)); 仅当您有一个受限制的队列并且该队列已满时,才会启动高于核心号的任何线程。我怀疑大量的初级Java多线程程序员都没有意识到这种行为ThreadPoolExecutor。 现在,我有一个特定的用例,它不是最佳的。我正在寻找无需编写自己的TPE类的方法来解决该问题的方法。 我的要求是要对可能不可靠的第三方进行回调的Web服务。 我不想与Web请求同步进行回调,因此我想使用线程池。 我通常一分钟会收到几个,所以我不想拥有newFixedThreadPool(...)大量休眠的线程。 我每隔一段时间就会收到大量此类流量,我想将线程数扩展到某个最大值(比如说50)。 我需要尽最大的努力来完成所有回调,所以我希望将大于50的所有其他队列排队newCachedThreadPool()。 我如何解决此限制,ThreadPoolExecutor即在需要启动更多线程之前队列必须被限制为已满的地方?如何在排队任务之前启动更多线程? 编辑: @Flavio很好地说明了使用ThreadPoolExecutor.allowCoreThreadTimeOut(true)来使核心线程超时和退出。我考虑过,但是我仍然想要核心线程功能。我不希望池中的线程数尽可能降低到核心大小以下。
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.