在所有其他线程在Java中完成工作后,是否有100%可靠的方法来阻止线程?

时间:2014-05-20 19:15:18

标签: java multithreading

我有一个消费者线程和几个生产者线程共享一个作业列表。生产者线程在生产"生产限制时结束。到达了。但是,如果不使用" 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));

2 个答案:

答案 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中移动该代码......

你们同意吗?