Java 在不同类中使用执行器和同步倒计时锁存器

Java 在不同类中使用执行器和同步倒计时锁存器,java,multithreading,Java,Multithreading,嗨,伙计们,我在学习一个教程,我对一些我尝试应用从教程中获得的知识的事情感到好奇 下面是跑步者课程 package Tutorial2; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Runner { public void runIt() {

嗨,伙计们,我在学习一个教程,我对一些我尝试应用从教程中获得的知识的事情感到好奇

下面是跑步者课程

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");
   }
}
我想做的很简单。所以我想问你们几个问题。所以我知道CountDownLatch在任何时候都会倒计时,称为倒计时。然后,如果倒计时为零,wait将返回

我很好奇的是,Runner类中的CountDownLatch和Process类中的CountDownLatch应该是不同的,但Process类中的CountDownLatch达到零似乎也会触发。Wait,我将其放入Runner类中。当我只是将CountDownLatch作为参数传递到流程类中,并且流程类中的CountDownLatch值并没有返回给Runner类时,这是如何工作的


另外,在下面,我设置了两个执行器,这样每个执行器都会对CountDownLatch进行倒计时,但我得到的处理线程数似乎比返回前输入的线程数(6)要多。我做错了什么?当CountDownLatch达到0,即两个执行器总共运行了6次线程时,如何使“程序结束”被打印出来。

By
this.latch=latch使用构造函数参数中传递的引用(即在
runIt
方法中创建的引用)覆盖对象的引用。分配
CountDownLatch闩锁=新的CountDownLatch(6)Process
类中的code>是无用的,它什么也不做。只是把你弄糊涂了


第二个问题不清楚。。。是的,一旦它倒计时到零,它就会释放
wait
。。。不确定它与您有多少线程/执行器有何关系。

By
this.latch=latch使用构造函数参数中传递的引用(即在
runIt
方法中创建的引用)覆盖对象的引用。分配
CountDownLatch闩锁=新的CountDownLatch(6)Process
类中的code>是无用的,它什么也不做。只是把你弄糊涂了

第二个问题不清楚。。。是的,一旦它倒计时到零,它就会释放
wait
。。。不确定它与您有多少线程/执行器有什么关系

我在一节课上做了
int倒计时
,在另一节课上做了同样的
int倒计时
。在一个类中,我创建了一个构造函数来传递另一个类的
countDown
,我创建了
this.countDown=countDown
,以确保它们引用相同的变量。然后我。。。但两个类的倒计时值并不相同

变量不是Java中其他任何东西都可以“引用”的东西。变量是可以保存值的命名位置

Java中的所有值都可以分为两类:;对象引用和基元值。对象引用是指向Java堆上对象的指针。一个基本值基本上就是一个数字,比如
5
5
是类型为
int
的基本值


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

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

我在一节课上做了
int倒计时
,在另一节课上做了同样的
int倒计时
。在一个类中,我创建了一个构造函数来传递另一个类的
countDown
,我创建了
this.countDown=countDown
,以确保它们引用相同的变量。然后我。。。但两个类的倒计时值并不相同

变量不是Java中其他任何东西都可以“引用”的东西。变量是可以保存值的命名位置

Java中的所有值都可以分为两类:;对象引用和基元值。对象引用是指向Java堆上对象的指针。一个基本值基本上就是一个数字,比如
5
5
是类型为
int
的基本值


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


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

那么Runner类中的CountDownLatch仍然在Process类中使用?因为我认为如果一个值在参数中传递给另一个类,它只会覆盖“value”,但仍然在其方法中使用同一个类中的变量。是的,不用担心第二个,我意识到如果我将闩锁设置为静态,那么works@forJJava变量只保留对对象的引用。在
runIt
和Process类中的两个位置创建对象,但使用前者覆盖对后者的引用。“覆盖‘值’”这个词在JavaHey中毫无意义,所以根据你所说的,我尝试了其他方法。我在一节课上做了整数倒计时,在另一节课上做了相同的整数倒计时。在一个类中,我创建了一个构造函数来传递countDow
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();
    }
}