当前位置: 首页 > 知识库问答 >
问题:

在不同类中使用执行器和同步CountDownLatch

冯翔
2023-03-14

大家好,我正在学习一个教程,我对一些我尝试应用从教程中获得的知识的事情很好奇。

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();
    }
}

我很好奇的是Runner类中的CountDownLatch和Process类中的CountDownLatch应该是不同的,但在Process类的CountDownLatch中达到零似乎也会触发。Await我在Runner类中放置了它。当我只将CountDownLatch作为参数传递给Process类,而Process类的CountDownLatch的值没有返回给Runner类时,这是如何工作的?

另外,在下面,我设置了两个执行器,这样每个执行器都将对CountDownLatch进行倒计时,但是在返回之前,我得到的处理线程数似乎比我输入的线程数(6)还要多。我做错了什么?当CountDownLatch达到0时,即线程已经从两个执行器中总共运行了6次,我如何使它能够打印“Program Ended”。

共有1个答案

萧献
2023-03-14

通过this.latch=latch;,您可以用传入构造函数参数的引用覆盖对象的引用(即在runit方法中创建的引用)。process类中的赋值CountDownLatch latch=new CountDownLatch(6);毫无用处,它什么也不做。只是让你困惑。

第二个问题不清楚...是的,只要它倒数到零,它就会释放await...不确定它与您拥有多少线程/执行器有什么关系。

 类似资料:
  • 一旦遇到这样的问题,这里还有更多内容,然后发现了 一个适当恶劣的解决方法。 这篇文章没有列在索引中,但是为满足你的好奇心而保留了下来。

  • 问题内容: 我面临有关Java方法同步的问题。希望我能简要解释一下: 我在两个不同的类中,在两个不同的包中有两个不同的方法。就像是: 好的,所以现在我需要同步这两个 不是thread的方法 。到目前为止,我有两种不同的方法: 共享信号量 。 在和外部创建一个共享的静态信号量,例如: 无论如何,我真的不知道JVM是否会将其视为共享信号量。 已同步(SharedClass.class) 。 使用共享类

  • 我在阅读oracle的多线程官方教程时,遇到了这个例子(假设< code>c1和< code>c2从未一起使用): 据说通过使用锁1 然而,我并不认为这有助于减少阻塞,因为它们彼此之间没有依赖关系。我有多个线程同时运行这两个方法,当我使用lock对象和this关键字时,性能非常相似。 有人可以帮助解释我的困惑吗?喜欢用一个例子来说明差异。 除了这里的讨论,这篇文章也帮助澄清了我的疑虑。要点:将sy

  • 我试图设置两个线程,它们在另一个类中增加或减少一个整数。我对这个属性的同步有一些问题。 这是我的主要类,我在其中设置了线程和计数器类: 这是我的柜台课: 这是我的Thread1类:(runnable类是一样的,只是用“实现Runnable”而不是“扩展线程”) 但是,我的输出始终是10000000。尽管我同步了两种方法。有人能解释这是怎么回事吗?

  • 问题内容: 我的任务是按以下顺序创建线程:如果A开始->启动B和C,如果B开始->启动D。并以相反的顺序销毁它们如果D然后B。如果B和C然后A。它。我设法做到了,但我想还有更好的方法。你有什么建议吗? 在您发表评论后,我更改了代码,这非常简单。但是现在看起来“愚蠢”。我想更改if语句和实现的硬性,有什么建议吗?寻求建议,我正在与您一起学习。 这是我的新代码: 问题答案: 您的代码中存在一些缺陷,这

  • Spring留档声明,即使要执行同步超文本传输协议调用,我们也必须从RestTemboard切换到。 目前,我有以下代码: 当然,我可以在这里使用CountdownLatch,但它看起来像是API滥用。 如何执行同步请求?