[英]Using executors and synchronizing CountDownLatch in different classes
大家好,我正在關注一個教程,我對嘗試應用從教程中獲得的知識感到有些好奇。
下面是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都會遞減1。 如果倒計時為零,則.await將返回。
我很好奇的是,Runner類中的CountDownLatch和Process類中的CountDownLatch應該是不同的,但Process類的CountDownLatch中達到零似乎也觸發了.await,我將其放在Runner類中。 當我僅將CountDownLatch作為參數傳遞給Process類並且沒有Process類的CountDownLatch的值返回到Runner類時,該如何工作?
另外,在下面,我設置了兩個執行器,以便每個執行器都將CountDownLatch倒計時,但是似乎正在處理的線程數比返回之前輸入的數字(6)多。 我究竟做錯了什么? 我該怎么做,以便當CountDownLatch達到0時即打印出“程序結束”,即兩個執行器總共運行了6次線程。
通過this.latch = latch;
您用傳入構造函數參數的引用(即在runIt
方法中創建的引用)覆蓋對象的引用。 分配CountDownLatch latch = new CountDownLatch(6);
在Process
類中是沒有用的,它什么也不做。 只是讓您感到困惑。
第二個問題是不清楚......是的,一旦它倒計數至零,它釋放await
...不知道它是如何與你有多少線程/執行人有。
我做了
int countDown
在一類和總犯同樣的int countDown
在另一個類。 在一個類中,我構造了一個構造函數,以從另一個類中傳遞countDown
,而我使this.countDown = countDown
來確保它們引用相同的變量。 然后我...但是來自兩個類的countDown並不指向相同的值。
變量不是Java中其他任何事物都可以“引用”的東西。 變量是可以保存值的命名位置。
Java中的所有值都屬於以下兩類之一: 對象引用和原始值 。 對象引用是指向Java堆上的對象的指針。 基本值基本上只是一個數字,例如5
。 5
是int
類型的原始值。
當程序執行this.countDown = countDown
,這不會在兩個變量之間建立任何關系。 它所做的一切就是將this.countDown
設置this.countDown
等於該特定時間在countDown
中countDown
任何值。 如果程序隨后更改this.countDown
或countDown
,則對其他變量沒有影響。
在某些編程語言中,您可以創建一個別名 -一個看起來像唯一變量的東西,但實際上是對其他變量的引用--但您永遠無法在Java中做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.