Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一种100%确定的方法可以在所有其他线程在Java中完成任务后停止线程?_Java_Multithreading - Fatal编程技术网

是否有一种100%确定的方法可以在所有其他线程在Java中完成任务后停止线程?

是否有一种100%确定的方法可以在所有其他线程在Java中完成任务后停止线程?,java,multithreading,Java,Multithreading,我有一个消费者线程和几个生产者线程共享一个作业列表。生产者线程在达到其“生产极限”时结束。然而,如果不使用“中断”,我就无法成功地结束使用者线程 我试图阻止消费者线程。在consumer thread中,我使用了一个AtomicBoolean变量(JDK 1.6)来停止run方法内部的循环。但是,我无法在主类中找到一种方法来了解所有生产者线程都已结束。尝试在主类中的生产者线程上使用联接 请注意,由于所有线程同时运行。我的主类中的当前代码突然结束了使用者线程,而没有完成所有作业。我正在寻找一个答案

我有一个消费者线程和几个生产者线程共享一个作业列表。生产者线程在达到其“生产极限”时结束。然而,如果不使用“中断”,我就无法成功地结束使用者线程

我试图阻止消费者线程。在consumer thread中,我使用了一个AtomicBoolean变量(JDK 1.6)来停止run方法内部的循环。但是,我无法在主类中找到一种方法来了解所有生产者线程都已结束。尝试在主类中的生产者线程上使用联接

请注意,由于所有线程同时运行。我的主类中的当前代码突然结束了使用者线程,而没有完成所有作业。我正在寻找一个答案,而不使用

执行器服务/未来/可调用

下面是my main方法中的代码片段:

//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));
//作业容器
JobContainer JobContainer=新的JobContainer(100);
//一个消费者
消费者=新消费者(jobContainer);
螺纹T0=新螺纹(耗电元件);
T0.start();
//多产商
JobProducer JobProducer=新的JobProducer(jobContainer,0,10);
线程T1=新线程(jobProducer);
T1.start();
jobProducer1=新的JobProducer(jobContainer,1,10);
螺纹T2=新螺纹(jobProducer1);
T2.start();
//联接语句
T0.join();
T1.join();
T2.连接();
//停止消费
consumer.stop(新原子布尔值(true));

使用具有足够许可证的
倒计时闩锁
。当生产者完成生产时,它倒计时。让一个(额外的)线程在闩锁上等待,然后杀死消费者/执行任何清理。

我做了一个解决方法。在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中


你们同意吗?

JobProducer
中有一个
boolean
字段,让你们知道工作是否完成了,怎么样?此字段以
false
开头,完成作业后更改为
true
以通知客户端。是否要我检查main方法中所有JobProducer的布尔字段?好的,您还可以做什么?这是一种非常简单的方法,您至少应该有一个
线程[]
,而不是有多个手动
线程x1、x2。。。xn
在您的代码中。或者更好的是,使用已经处理此类问题的非期望的
ExecutorService
。为什么“不使用中断”?如果消费者在阻塞队列中等待,就很难以其他方式吸引他们的注意力。另一方面,如果你不阻止它怎么办?如果将使用者设为守护进程线程,该怎么办。当最后一个非守护进程线程死亡时,JVM将杀死它。让一个线程杀死另一个线程是不好的。线程应该相互配合。当一个长时间运行的线程停止时,其他线程应该设置一个标志并(如有必要)中断它。然后,被中断的线程应该清理它需要清理的任何内容,并从其顶级run()方法返回。您必须将整个
while
循环移动到
synchronized
块:
synchronized(jobContainer){while(!jobContainer.isEmpty())jobContainer.wait(100);}
。对
作业容器
的所有其他访问,即从中删除项目的代码,也必须在
同步(作业容器)
块中进行。