`

wait notify的替代CountDownLatch

阅读更多

Countdown latches are single-use barriers that allow one or more threads to
wait for one or more other threads to do something. The sole constructor for
CountDownLatch takes an int that is the number of times the countDown method
must be invoked on the latch before all waiting threads are allowed to proceed.

 

import java.util.concurrent.CountDownLatch;

class Driver { 
	private static int N = 10;
	
	public static void main(String[] args) throws InterruptedException {
		CountDownLatch startSignal = new CountDownLatch(1);
		CountDownLatch doneSignal = new CountDownLatch(N);

		for (int i = 0; i < N; ++i)
			// create and start threads
			new Thread(new Worker(startSignal, doneSignal)).start();

		doSomethingElse(); // don't let run yet
		startSignal.countDown(); // let all threads proceed
		doSomethingElse();
		doneSignal.await(); // wait for all to finish
		System.out.println("Oh yeah! done signal finished.");
	}
	
	private static void doSomethingElse() {
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

class Worker implements Runnable {
	private final CountDownLatch startSignal;
	private final CountDownLatch doneSignal;

	Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
		this.startSignal = startSignal;
		this.doneSignal = doneSignal;
	}

	public void run() {
		try {
			startSignal.await();
			doWork();
			doneSignal.countDown();
		} catch (InterruptedException ex) {
		} // return;
	}

	void doWork() { 
		System.out.println("working...");
    }
}

 另一例:

// Simple framework for timing concurrent execution
public static long time(Executor executor, int concurrency, final Runnable action) throws InterruptedException {
    final CountDownLatch ready = new CountDownLatch(concurrency);
    final CountDownLatch start = new CountDownLatch(1);
    final CountDownLatch done = new CountDownLatch(concurrency);
    for (int i = 0; i < concurrency; i++) {
        executor.execute(new Runnable() {
            public void run() {
                ready.countDown(); // Tell timer we're ready
                try {
                    start.await(); // Wait till peers are ready
                    action.run();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                } finally {
                    done.countDown(); // Tell timer we're done
                }
            }
        });
    }
    ready.await(); // Wait for all workers to be ready
    long startNanos = System.nanoTime();
    start.countDown(); // And they're off!
    done.await(); // Wait for all workers to finish
    return System.nanoTime() - startNanos;
}

Note that the method uses three countdown latches. The first, ready, is used
by worker threads to tell the timer thread when they’re ready. The worker threads
then wait on the second latch, which is start. When the last worker thread
invokes ready.countDown, the timer thread records the start time and invokes
start.countDown, allowing all of the worker threads to proceed. Then the timer
thread waits on the third latch, done, until the last of the worker threads finishes
running the action and calls done.countDown. As soon as this happens, the timer
thread awakens and records the end time.

分享到:
评论

相关推荐

    xian ti jiao yiban

    4. **条件变量(Condition)**:`java.util.concurrent.locks.Condition`接口提供了一种基于条件的等待机制,可以替代`wait()`、`notify()`和`notifyAll()`,使得线程等待满足特定条件后再继续执行。 5. **信号量...

    java-thread-vedio.rar_java vedio

    - **Phaser**:Java 7引入的同步工具,可以替代CountDownLatch和CyclicBarrier。 5. **线程优先级**: Java中线程有10个优先级,默认优先级是5(NORM_PRIORITY)。优先级高的线程更有可能获取CPU资源,但并不保证...

    java 并发编程实战

    2. **Phaser**:Java 7引入的新工具,可替代CountDownLatch和CyclicBarrier,具有更灵活的分阶段并发控制。 六、线程池 Java的 **Executor框架** 提供了线程池服务,通过ThreadPoolExecutor可以定制线程池的行为,...

    java并发书籍xxxxxxx

    5. **wait()与notify()**:这两个方法在`Object`类中,用于线程间的通信。线程调用wait()会释放锁并进入等待状态,直到其他线程调用notify()或notifyAll()唤醒。 6. **ThreadLocal**:每个线程都有自己的...

    java多线程设计模式详解

    - `Lock`和`Condition`:Java 5引入的`java.util.concurrent.locks`包提供了更强大的锁机制,如`ReentrantLock`,以及可以替代`wait()`/`notify()`的`Condition`接口。 3. **线程状态与生命周期** - 新建(New)...

    Java并发程序设计教程.pdf

    `Lock`接口和其实现如`ReentrantLock`允许更细粒度的锁定控制,`Condition`则提供了更强大的条件等待和唤醒机制,而`wait`、`notify`和`notifyAll`则是在`Object`类中定义的原生同步方法,用于线程间的等待和唤醒。...

    大并发编程交流

    `Condition` 是与 `ReentrantLock` 配合使用的条件对象,可以替代传统的 `wait()` 和 `notify()` 方法实现更加灵活的线程间通信。 - **AtomicInteger、ConcurrentHashMap、ArrayBlockingQueue**:这些类是 Java 并...

    DataSync java

    9. **线程通信**:`wait()`、`notify()`和`notifyAll()`方法是Object类的方法,用于线程间通信,通常配合`synchronized`使用。`wait()`使当前线程等待,`notify()`或`notifyAll()`唤醒等待的线程。 10. **线程池**...

    Java 多线程与并发-Java并发知识体系详解.pdf

    线程的中断、互斥同步可以通过中断机制、wait/notify机制和`synchronized`关键字实现,线程间的协作可以使用Condition、CountDownLatch、CyclicBarrier等工具类。 在Java中,除了`synchronized`,还有更高级的锁...

    java核心技术高级特性第八版

    书中会详细介绍线程的生命周期、同步机制(如synchronized关键字、wait/notify、Lock接口)以及并发工具类(如Semaphore、CountDownLatch等)的使用。 其次,Java的反射机制也是高级特性之一。通过反射,程序可以在...

    java常用锁使用demo工程

    - **条件变量(Condition)**:Lock接口提供了一个Condition接口,可以创建多个条件变量,比`synchronized`的wait/notify机制更灵活。 3. 其他同步工具类: - **Semaphore**:信号量,可以控制同时访问特定资源的...

    JavaThread基础知识.pdf

    4. **wait/notify机制**:使用while循环配合wait(),避免死锁和误唤醒。 **对象的锁机制:** 每个Java对象都有一个内置锁,可以通过同步方法或同步块获取。锁是可重入的,意味着一个线程可以多次获得同一锁。此外,...

    java同步

    - Java中的每个对象都可以作为监视器,线程通过调用对象的`wait()`、`notify()`或`notifyAll()`方法来协作。这些方法必须在同步块或同步方法中使用,否则会抛出`IllegalMonitorStateException`。 4. **死锁** - ...

    Java企业级项目常见API基本原理和演示 Java学习资料

    理解和使用synchronized关键字、wait()、notify()方法,以及并发工具类如Semaphore、CountDownLatch、CyclicBarrier,可以提高程序的并发性能和正确性。 3. **IO流**:Java IO流分为字节流和字符流,包括输入流和...

    Java并发编程:设计原则与模式(第二版)-3PDF

    - **wait/notify机制**:线程间的通信,等待特定条件满足后继续执行。 3. **并发模式**: - **生产者消费者模型**:利用队列实现数据的生产和消费,避免阻塞。 - **读写者模型**:允许多个读操作同时进行,但写...

    第20章 Part3 多线程互斥与协作.pdf

    - **等待/通知机制:** `wait()`和`notify()`方法可用于实现线程间的等待和唤醒。 - **`join`方法:** 一个线程可以调用另一个线程的`join()`方法来等待该线程的结束。 - **屏障(Barriers):** `CyclicBarrier`和`...

    国外java面试题 关于 Java基础, Spring, SpringBoot 和 Hibernate

    5. **多线程**:线程创建、同步机制(synchronized关键字、wait()、notify())和并发工具类(如Semaphore、CountDownLatch)。 6. **设计模式**:单例模式、工厂模式、装饰器模式等经典设计模式的实现和应用。 在...

    Java线程系列操作.zip

    - **wait(), notify(), notifyAll()**:这三个方法用于线程间的通信,它们只能在synchronized环境中使用。 4. **线程的优先级与调度** - **优先级**:Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_...

    阿里巴巴开发手册

    - 尽量避免使用wait()和notify(),优先考虑使用并发工具类如Semaphore、CountDownLatch等。 7. **性能优化**: - 避免在循环体内进行不必要的计算。 - 使用StringBuilder而非+操作符拼接字符串。 - 合理使用...

    JAVA多线程学习内容

    线程可以通过sleep()方法进入阻塞状态,通过join()方法让主线程等待子线程完成,通过wait()和notify()或notifyAll()方法进行线程间的同步与通信。 Java提供了多种线程控制机制,如synchronized关键字用于实现互斥...

Global site tag (gtag.js) - Google Analytics