生产者消费者 - 的ExecutorService&ArrayBlockingQueue(produ

2019-09-16 21:52发布

我想知道如果我的生产者消费者设计的理解是使用的ExecutorService&ArrayBlockingQueue正确的。 据我所知,来实现这个设计不同的方式,但我想,到了最后,这取决于问题本身。

我不得不面对的问题是这样的:我有一个生产者谁从大文件(6GB)读取; 它由线读取线和每行转换为一个对象。 它把对象的ArrayBlockingQueue。

消费者(少数)取从ArrayBlockingQueue的对象,并坚持这个数据库。

现在,很明显生产者比消费者更快; 它需要几秒钟到每一行转换为对象级分但对于消费者花费更长的时间。

所以......如果我愿意做这个用来加快这个过程:我创建了2归类“ProducerThread”和“ConsumerThread”他们分享ArrayBlockingQueue。 这2间协调的主题是这样的:

@Override
public void run()
{
    try{

        ArrayBlockingQueue<Ticket> queue = new ArrayBlockingQueue<Ticket>(40);
        ExecutorService threadPool = Executors.newFixedThreadPool(8);

        threadPool.execute(new SaleConsumerThread("NEW YORK", queue)); 
        threadPool.execute(new SaleConsumerThread("PARIS", queue));
        threadPool.execute(new SaleConsumerThread("TEL AVIV", queue));
        threadPool.execute(new SaleConsumerThread("HONG KONG", queue));
        threadPool.execute(new SaleConsumerThread("LONDON", queue));
        threadPool.execute(new SaleConsumerThread("BERLIN", queue));
        threadPool.execute(new SaleConsumerThread("AMSTERDAM", queue));

        Future producerStatus = threadPool.submit(new SaleProducerThread(progressBar, file, queue)); 
        producerStatus.get(); 
        threadPool.shutdown();   

    }catch(Exception exp)
    {
        exp.printStackTrace();
    }
}

我的问题是:

  1. 将上述实际设计中使用的每个线程并行 ? 我的电脑是双2.4GHz的四核。

  2. 我不知道什么是未来和获得()是?

结果,顺便说一句,是快速(考虑第一个版本是连续的,花了3小时),现在大约需要40分钟(但也许是有改进的余地)。

感谢您的任何指针

Answer 1:

我想看看有多少时间花在等待IO多少时间在CPU中度过的。 我怀疑你的主要瓶颈是数据库,你需要看看如何可以使进口更加高效。 你可以尝试分批您的更新,因为这可以提高吞吐量。



Answer 2:

回答:

  1. 我不知道你所说的“用每个线程并发”的意思。 但可以肯定所有的线程可以同时执行。 你的表现,都将取决于有多少线程已经和你的数据是如何划分。 您可以使用的线程数量进行试验,试图获得更好的结果,而不是分配每个城市线程,也许你可以使用一个记录编号,只是每个线程分配到的记录数的模量。 假设你有10个线程,记录1,11,21,等会去一个线程,2,22等,以线程2。 这样,您将获得相同数量的每个线程的交易,所以你将有螺纹的充分利用,直到你完成。
  2. Future是让当事件完成代码块。 在get方法返回的结果SaleProducerThread在这种情况下。


文章来源: producer consumer - ExecutorService & ArrayBlockingQueue