嗨,大家好,我正在关注一个教程,我很好奇几件事情,我尝试应用从教程中获得的知识。使用执行器和同步CountDownLatch在不同的类
下面是一个亚军类
package Tutorial2;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Runner {
public void runIt() {
CountDownLatch latch = new CountDownLatch (6);
ExecutorService executor = Executors.newFixedThreadPool(2);
for (int i = 0; i < 10; i++) {
executor.submit(new Process(i, latch));
}
ExecutorService executor2 = Executors.newFixedThreadPool(2);
for (int i = 1000; i < 1010; i++) {
executor2.submit(new Process(i, latch));
}
try {
latch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Program Ended");
}
}
然后下面是我的处理器类
package Tutorial2;
import java.util.concurrent.CountDownLatch;
public class Process implements Runnable {
private int id;
CountDownLatch latch = new CountDownLatch(6);
public Process(int id, CountDownLatch latch) {
this.id = id;
this.latch = latch;
}
@Override
public void run() {
System.out.println("Task Starting ID : " + id);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Task Finished ID : " + id);
latch.countDown();
}
}
这是很简单的什么,我试图做的。所以我想问你一些专业人士的问题。所以我明白,每当调用.countDown时CountDownLatch都会减1。然后,如果倒计时为零,则等待将返回。
我很好奇的是Runner类中的CountDownLatch和Process类中的CountDownLatch应该不同,但在Process类的CountDownLatch中达到零也似乎触发了我在Runner类中放置的.await。当我只将CountDownLatch作为参数传递给Process类并且Process类中的CountDownLatch值没有返回给Runner类时,这是如何工作的?
另外,下面我设置了两个执行程序,这样每个执行程序都会对CountDownLatch进行倒计时,但是在返回之前,我似乎正在处理的线程数比我输入的数字(6)多。我究竟做错了什么?我如何做到这一点,以便当CountDownLatch达到0时即打印“程序结束”,即从两个执行程序中总共运行了6次线程。
那么Runner类中的CountDownLatch仍然在Process类中使用?因为我想如果一个值传递给另一个类的参数,它只会覆盖'value',但仍然在其方法中使用同一个类中的变量。 – forJ
是啊不要担心第二个我认识到,如果我设置锁定为静态,那么它的工作 – forJ
@forJ Java变量只保留对象的引用。你在'runIt'和Process类的两个地方创建对象,但你用前者覆盖对后者的引用。单词“overrides the'value'”在Java – kan