簡體   English   中英

在不同的類中使用執行程序並同步CountDownLatch

[英]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 5int類型的原始值。


當程序執行this.countDown = countDown ,這不會在兩個變量之間建立任何關系。 它所做的一切就是將this.countDown設置this.countDown等於該特定時間在countDowncountDown任何值。 如果程序隨后更改this.countDowncountDown ,則對其他變量沒有影響。

在某些編程語言中,您可以創建一個別名 -一個看起來像唯一變量的東西,但實際上是對其他變量的引用--但您永遠無法在Java中做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM