Tag: blockingqueue

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 […]

什么时候应该使用SynchronousQueue

new SynchronousQueue() new LinkedBlockingQueue(1) 有什么不同? 当我应该使用容量为1的LinkedBlockingQueue SynchronousQueue ?

C ++ 11中有没有并发容器?

特别是,我正在寻找一个阻塞队列。 C ++ 11中有这样的事情吗? 如果不是,我的其他select是什么? 我真的不想自己去了线程水平了。 太容易出错。

阻塞队列和multithreading的消费者,如何知道何时停止

我有一个单线程生产者创build一些任务对象,然后将其添加到一个ArrayBlockingQueue (这是固定的大小)。 我也开始一个multithreading的消费者。 这是build立一个固定的线程池( Executors.newFixedThreadPool(threadCount); )。 然后,我将一些ConsumerWorker实例提交给此ThreadPool,每个ConsumerWorker都具有对上述ArrayBlockingQueue实例的引用。 每个这样的工作人员将在队列中做一个take()处理任务。 我的问题是,有什么最好的方式让工人知道什么时候不会有任何工作要做。 换句话说,我怎么告诉工人,生产者已经join队列,从这一刻起,每个工人应该停下来,看看队列是空的。 我现在得到的是一个安装程序,我的Producer用一个callback来初始化,当他完成它的工作(添加队列的东西)时触发callback。 我还保留了我创build并提交给ThreadPool的所有ConsumerWorkers的列表。 当生产者callback告诉我生产者完成时,我可以告诉每个工人。 在这一点上,他们应该简单地继续检查队列是否为空,当它变为空时,它们应该停止,从而允许我正常closures下ExecutorService线程池。 这是这样的 public class ConsumerWorker implements Runnable{ private BlockingQueue<Produced> inputQueue; private volatile boolean isRunning = true; public ConsumerWorker(BlockingQueue<Produced> inputQueue) { this.inputQueue = inputQueue; } @Override public void run() { //worker loop keeps taking en element from the queue as long as the […]

如何让ThreadPoolExecutor在排队之前将线程增加到max?

我一直在使用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。 如果可能的话,我不希望池中的线程数量低于核心大小。