大家好,我正在关注一个教程,我很好奇我尝试应用从教程中获得的知识。
以下是Runner类
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就会减一。如果倒计时为零,则.await将返回。
我很好奇的是,Runner类中的CountDownLatch和Process类中的CountDownLatch应该是不同的,但在Process类的CountDownLatch中达到零似乎也触发了我放入Runner类的.await。当我只将CountDownLatch作为参数传递给Process类时,如何将Process类的CountDownLatch值返回给Runner类?
另外,在下面,我设置了两个执行程序,以便每个执行程序将倒计时CountDownLatch但我似乎在返回之前获得的处理线程数比我输入的数字(6)要多。我究竟做错了什么?如何在CountDownLatch达到0时打印“Program Ended”,即两个执行器总共运行了6次线程。
答案 0 :(得分:2)
通过this.latch = latch;
,您可以使用传入构造函数参数的对象(即在runIt
方法中创建的对象)覆盖对象的引用。 CountDownLatch latch = new CountDownLatch(6);
课程中的作业Process
没用,它什么也没做。只是让你困惑。
第二个问题不清楚......是的,一旦它倒数到零,就会释放await
......不确定它与你有多少线程/执行者有关。
答案 1 :(得分:2)
我在一个班级中制作了
int countDown
,并在另一个班级中制作了相同的int countDown
。在一个类中,我创建了一个构造函数来从另一个类countDown
传递this.countDown = countDown
,以确保它们引用相同的变量。然后我......但是两个类的countDown没有指向相同的值。
变量不是Java中任何其他东西可以引用的东西。&#34;&#34;变量是一个可以保存值的命名位置。
Java中的所有值都属于以下两种类别之一; 对象引用和原始值。 Object引用是指向Java堆上的对象的指针。原始值基本上只是一个数字,如5
。 5
是int
类型的原始值。
当你的程序执行this.countDown = countDown
时,它不会在两个变量之间建立任何关系。它所做的就是将this.countDown
设置为等于特定时刻countDown
中发生的任何值。如果程序随后更改this.countDown
或countDown
,则对其他变量没有影响。
在某些编程语言中,您可以创建别名 ---看起来像一个唯一变量的东西,但它实际上是对某些其他变量的引用 - - 但你永远不能用Java做到这一点。