使用执行程序并在不同的类

时间:2016-02-25 17:45:40

标签: java multithreading

大家好,我正在关注一个教程,我很好奇我尝试应用从教程中获得的知识。

以下是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次线程。

2 个答案:

答案 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堆上的对象的指针。原始值基本上只是一个数字,如55int类型的原始值。

当你的程序执行this.countDown = countDown时,它不会在两个变量之间建立任何关系。它所做的就是将this.countDown设置为等于特定时刻countDown中发生的任何值。如果程序随后更改this.countDowncountDown,则对其他变量没有影响。

在某些编程语言中,您可以创建别名 ---看起来像一个唯一变量的东西,但它实际上是对某些其他变量的引用 - - 但你永远不能用Java做到这一点。