我想知道如果我的生产者消费者设计的理解是使用的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();
}
}
我的问题是:
将上述实际设计中使用的每个线程并行 ? 我的电脑是双2.4GHz的四核。
我不知道什么是未来和获得()是?
结果,顺便说一句,是快速(考虑第一个版本是连续的,花了3小时),现在大约需要40分钟(但也许是有改进的余地)。
感谢您的任何指针