我有一个消费者线程和几个生产者线程共享一个作业列表。生产者线程在生产"生产限制时结束。到达了。但是,如果不使用" Interrupt"我无法成功结束消费者线程。
我试图阻止消费者线程。在消费者线程中,我使用了AtomicBoolean变量(JDK 1.6)来停止run方法中的循环。但是,我无法在主类中找到一种方法来了解所有生产者线程已经结束。尝试在主类中使用生成器线程上的连接。
请注意,因为所有线程都在同时运行。我的主类中的当前代码突然结束了消费者线程而没有完成所有作业。我正在寻找答案而不使用
的ExecutorService /未来/可赎回。
按照我的主要方法的代码段:
//Job container
JobContainer<CalcJob> jobContainer = new JobContainer<CalcJob>(100);
//One Consumer
Consumer consumer = new Consumer(jobContainer);
Thread T0 = new Thread(consumer);
T0.start();
//Multiple Producers
JobProducer jobProducer = new JobProducer(jobContainer, 0, 10);
Thread T1 = new Thread(jobProducer);
T1.start();
JobProducer jobProducer1 = new JobProducer(jobContainer, 1, 10);
Thread T2 = new Thread(jobProducer1);
T2.start();
//Join statements
T0.join();
T1.join();
T2.join();
//Stop consumer
consumer.stop(new AtomicBoolean(true));
答案 0 :(得分:1)
对所有生产者使用具有足够许可的CountDownLatch
。当生产者终结者生产时,它会倒计时。让一个(额外的)线程等待锁存器,然后杀死消费者/执行任何清理。
答案 1 :(得分:0)
我做了一个工作。在main方法中,我修改了上面代码的最后一部分,如下所示,
//Wait until all jobs are processed
while(false == jobContainer.isEmpty()){
synchronized(jobContainer){
jobContainer.wait(100);
}
}
//once job list is empty, stop the consumer
calculator.stop(new AtomicBoolean(true));
注意:我也可以在JobContainer中移动该代码......
你们同意吗?