大家好,我正在学习一个教程,我对一些我尝试应用从教程中获得的知识的事情很好奇。
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”。
通过this.latch=latch;
,您可以用传入构造函数参数的引用覆盖对象的引用(即在runit
方法中创建的引用)。process
类中的赋值CountDownLatch latch=new CountDownLatch(6);
毫无用处,它什么也不做。只是让你困惑。
第二个问题不清楚...是的,只要它倒数到零,它就会释放await
...不确定它与您拥有多少线程/执行器有什么关系。
一旦遇到这样的问题,这里还有更多内容,然后发现了 一个适当恶劣的解决方法。 这篇文章没有列在索引中,但是为满足你的好奇心而保留了下来。
我在阅读oracle的多线程官方教程时,遇到了这个例子(假设< code>c1和< code>c2从未一起使用): 据说通过使用锁1 然而,我并不认为这有助于减少阻塞,因为它们彼此之间没有依赖关系。我有多个线程同时运行这两个方法,当我使用lock对象和this关键字时,性能非常相似。 有人可以帮助解释我的困惑吗?喜欢用一个例子来说明差异。 除了这里的讨论,这篇文章也帮助澄清了我的疑虑。要点:将sy
问题内容: 我面临有关Java方法同步的问题。希望我能简要解释一下: 我在两个不同的类中,在两个不同的包中有两个不同的方法。就像是: 好的,所以现在我需要同步这两个 不是thread的方法 。到目前为止,我有两种不同的方法: 共享信号量 。 在和外部创建一个共享的静态信号量,例如: 无论如何,我真的不知道JVM是否会将其视为共享信号量。 已同步(SharedClass.class) 。 使用共享类
我试图设置两个线程,它们在另一个类中增加或减少一个整数。我对这个属性的同步有一些问题。 这是我的主要类,我在其中设置了线程和计数器类: 这是我的柜台课: 这是我的Thread1类:(runnable类是一样的,只是用“实现Runnable”而不是“扩展线程”) 但是,我的输出始终是10000000。尽管我同步了两种方法。有人能解释这是怎么回事吗?
问题内容: 我的任务是按以下顺序创建线程:如果A开始->启动B和C,如果B开始->启动D。并以相反的顺序销毁它们如果D然后B。如果B和C然后A。它。我设法做到了,但我想还有更好的方法。你有什么建议吗? 在您发表评论后,我更改了代码,这非常简单。但是现在看起来“愚蠢”。我想更改if语句和实现的硬性,有什么建议吗?寻求建议,我正在与您一起学习。 这是我的新代码: 问题答案: 您的代码中存在一些缺陷,这
Spring留档声明,即使要执行同步超文本传输协议调用,我们也必须从RestTemboard切换到。 目前,我有以下代码: 当然,我可以在这里使用CountdownLatch,但它看起来像是API滥用。 如何执行同步请求?