Tag: countdownlatch

可重置的倒计时补丁

我需要的东西直接等同于CountDownLatch ,但是可以重置(保持线程安全!)。 我不能使用经典的同步结构,因为它们在这种情况下根本不起作用(复杂的锁定问题)。 目前,我正在创建许多CountDownLatch对象,每个对象都替换前一个。 我相信这是在GC中的年轻一代(由于物体数量庞大)。 您可以看到使用下面的锁存器的代码(它是用于ns-3网络模拟器接口的java.net模拟的一部分)。 一些想法可能是尝试CyclicBarrier (JDK5 +)或Phaser (JDK7) 我可以测试代码并回到找到解决此问题的任何人,因为我是唯一可以将其插入正在运行的系统中以查看发生了什么的人:) /** * */ package kokunet; import java.io.IOException; import java.nio.channels.ClosedSelectorException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import kokuks.IConnectionSocket; import kokuks.KKSAddress; import kokuks.KKSSocket; import kokuks.KKSSocketListener; /** * KSelector * @version 1.0 * @author Chris Dennett */ public class KSelector extends SelectorImpl { // True […]

Java支持三种不同的并发模型

我在multithreading环境中经历了不同的并发模型( http://tutorials.jenkov.com/java-concurrency/concurrency-models.html ) 本文重点介绍了三种并发模型 。 并行工人 第一个并发模型就是我所说的并行工作模型。 传入的工作分配给不同的工作人员 。 流水线 工人的组织就像工厂assembly线上的工人一样。 每个工人只执行完整工作的一部分。 当该部分完成时,工人将工作转发给下一个工人。 每个工作者都在自己的线程中运行,并且不与其他工作者共享任何状态。 这有时也称为无共享并发模型。 function并行 函数并行的基本思想是使用函数调用实现程序。 函数可以被视为彼此发送消息的“ 代理 ”或“ 参与者 ”,就像在流水线并发模型(AKA反应或事件驱动系统)中一样。 当一个函数调用另一个函数时,这类似于发送消息。 现在我想为这三个概念映射java API支持 并行工作者 :它是ExecutorService , ThreadPoolExecutor , CountDownLatch API吗? assembly线 :将事件发送到JMS等消息传递系统并使用队列和主题的消息传递概念。 function并行 : ForkJoinPool在某种程度上和java 8流。 与溪流相比,ForkJoin池易于理解。 我是否正确映射这些并发模型? 如果没有,请纠正我。

将一个线程置于hibernate状态,直到另一个线程中的条件得到解决

以下是完成(我认为)同样事情的两个代码块。 我基本上是在尝试学习如何使用Java 1.5的并发来摆脱Thread.sleep(long)。 第一个示例使用ReentrantLock,第二个示例使用CountDownLatch。 我想要做的就是让一个线程进入hibernate状态,直到另一个线程中的条件得到解决。 ReentrantLock提供了一个布尔锁,用于决定是否唤醒另一个线程,然后我使用条件和等待/信号来hibernate另一个线程。 据我所知,我需要使用锁的唯一原因是,如果多个线程需要对boolean的写访问权。 CountDownLatch似乎提供与ReentrantLock相同的function,但没有(不必要的?)锁。 然而,感觉就像我通过初始化它只需要一次倒计时来劫持它的预期用途。 我认为它应该在多个线程要处理同一个任务时使用,而不是在多个线程在等待一个任务时使用。 所以,问题: 我在ReentrantLock代码中使用锁定“正确的东西”吗? 如果我只在一个线程中写入布尔值,那么锁是否必要? 只要我在唤醒任何其他线程之前重置布尔值我就不会导致问题,我可以吗? 是否有一个类似于CountDownLatch的类,我可以使用它来避免锁定(假设我应该在这个实例中避免它们),这更适合这个任务? 有没有其他方法来改进我应该注意的代码? 例1: import java.util.concurrent.locks.*; public class ReentrantLockExample extends Thread { //boolean – Is the service down? boolean serviceDown; // I am using this lock to synchronize access to sDown Lock serviceLock; // and this condition to sleep any threads waiting […]

灵活的CountDownLatch?

我现在遇到了两次问题,即生产者线程生成N个工作项,将它们提交给ExecutorService ,然后需要等到所有N个项都被处理完毕。 注意事项 N事先不知道 。 如果是这样的话,我只需创建一个CountDownLatch ,然后让生产者线程await()直到所有工作完成。 使用CompletionService是不合适的,因为尽管我的生产者线程需要阻塞(即通过调用take() ),但没有办法表明所有工作都已完成 ,导致生产者线程停止等待。 我目前最喜欢的解决方案是使用整数计数器,并在提交工作项时递增它,并在处理工作项时递减它。 在所有N个任务的提交之后,我的生产者线程将需要等待一个锁,检查counter == 0是否通知。 如果消费者线程已经递减计数器并且新值为0,则消费者线程将需要通知生产者。 有没有更好的方法来解决这个问题,或者java.util.concurrent是否有合适的构造我应该使用而不是“滚动自己的”? 提前致谢。

java Fork / Join池,ExecutorService和CountDownLatch

我们在java中有三种不同的multithreading技术 – Fork / Join池,Executor Service和CountDownLatch Fork / Join pool ( http://www.javacodegeeks.com/2011/02/java-forkjoin-parallel-programming.html ) Fork / Join框架旨在使分而治之的算法易于并行化。 这种类型的算法非常适合于可以分为两个或更多相同类型的子问题的问题。 他们使用递归将问题分解为简单的任务,直到这些变得足够简单直接解决。 然后组合子问题的解决方案以给出原始问题的解决方案 ExecutorService是一个扩展Executor类并表示异步执行的接口。 它为我们提供了管理结束和检测异步任务进度的机制。 invokeAll() :执行给定的任务,返回一个Futures列表,保存状态和结果全部完成。 Future.isDone()对于返回列表的每个元素都为true。 CountDownLatch 🙁 http://examples.javacodegeeks.com/core-java/util/concurrent/countdownlatch-concurrent/java-util-concurrent-countdownlatch-example/ ) CountDownLatch用于同步,以允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。 我的假设: 在这两种替代方案中,只有在完成所有任务/线程后才能知道最终结果。 这三种选择是互补的还是互补的 ?

如何等待一个产生它自己的线程的线程?

我正在尝试测试一个在单独的线程中工作的方法,简化它是这样的: public void methodToTest() { Thread thread = new Thread() { @Override public void run() { Clazz.i = 2; } }; thread.start(); } 在我的unit testing中,我想测试Clazz.i == 2,但我不能这样做,因为我认为断言是在线程更改值之前运行的。 我想使用另一个线程来测试它,然后使用join等待,但它仍然无法正常工作。 SSCCE: @Test public void sscce() throws InterruptedException { Thread thread = new Thread() { @Override public void run() { methodToTest() } }; thread.start(); thread.join(); AssertEquals(2, Clazz.i); } […]