我正在开发一个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 […]
当我们使用ThreadPoolExecutor进行交谈时,核心池大小和最大池大小究竟有什么区别? 可以用一个例子来解释吗?
我不能使用shutdown()和awaitTermination()因为在等待的时候可能会有新的任务被添加到ThreadPoolExecutor中。 所以我正在寻找一种方法来等待,直到ThreadPoolExecutor已经清空它的队列,并完成了它的所有任务,而不停止在这个点之前添加新的任务。 如果它有什么区别,这是Android的。 谢谢 更新 :几个星期后,重新审视这个,我发现一个修改后的CountDownLatch在这种情况下对我更好。 我会保留答案,因为它更多地适用于我所问的问题。
newCachedThreadPool()与newFixedThreadPool() 我应该什么时候使用其中一个? 哪种策略在资源利用方面更好?
看起来不可能创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那样重写execute(),但是SwingWorker在其execute()方法中做了什么是一个彻底的破解。
我一直在使用ThreadPoolExecutor的默认行为感到沮丧, ThreadPoolExecutor支持许多人使用的ExecutorService线程池。 引用Javadocs: 如果有多于corePoolSize但小于maximumPoolSize线程正在运行,则只有在队列已满时才会创build一个新线程。 这意味着如果使用下面的代码定义一个线程池,它将永远不会启动第二个线程,因为LinkedBlockingQueue是无界的。 ExecutorService threadPool = new ThreadPoolExecutor(1 /*core*/, 50 /*max*/, 60 /*timeout*/, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); 只有当你有一个有限的队列和队列已满时 ,核心号码以上的任何线程才会启动。 我怀疑有大量的初级Javamultithreading程序员不了解ThreadPoolExecutor的这种行为。 现在我有特定的用例,这是不是最佳的。 我正在寻找方法,而无需编写自己的TPE课程来解决这个问题。 我的要求是一个Web服务,正在回电给一个可能不可靠的第三方。 我不想与web请求同步callback,所以我想使用线程池。 我通常得到这些几分钟,所以我不想有一个newFixedThreadPool(…)与大量的线程,大多是hibernate的。 每隔一段时间,我都会碰到这种stream量,我想把线程的数量扩大到最大值(比方说50)。 我需要做一个最好的尝试来做所有的callback,所以我想排队50以上的任何额外的。我不想通过使用newCachedThreadPool()淹没我的networking服务器的其余部分。 如何解决ThreadPoolExecutor中的限制, 在更multithreading启动之前队列需要被限制和已满? 如何在排队任务之前启动更multithreading? 编辑: @Flavio关于使用ThreadPoolExecutor.allowCoreThreadTimeOut(true)使核心线程超时并退出很有用。 我认为,但我仍然需要核心线程function。 如果可能的话,我不希望池中的线程数量低于核心大小。
我正在尝试使用Java的ThreadPoolExecutor类来运行具有固定数量的线程的大量重量级任务。 每个任务都有很多地方可能由于例外而失败。 我已经子类ThreadPoolExecutor ,我已经重写了afterExecute方法应该提供任何运行任务时遇到的未捕获的exception。 但是,我似乎无法使其工作。 例如: 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 error: " […]