`
jilen
  • 浏览: 98336 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

CountDownLatch简单应用 -- java并发

 
阅读更多

  网络程序(或在其他异步的程序)由于是异步返回结果的,通常需要阻塞线程直到结果返回,这个时候,下面的代码就有用了。

 

 

 

 

 

package org.jilen.cookie.concurrent;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * This is a simple <strong>future</strong> implementation which <strong>allow
 * client to set value manually</strong>. <br/>
 * All get request are blocked before value is set. <br/>
 * Yes, the <code> new ArrayBlockingQueue(1);</code> can perform the same task.
 * But this version is much more lightweight
 * 
 * @author jilen.zhang@gmail.com
 * @param <V>
 */
public class WaitForValueFuture<V> {

    /**
     * latch used to block before value is set
     */
    private CountDownLatch   latch      = new CountDownLatch(1);
    private volatile boolean isValueSet = false;
   private AtomicBoolean isDone = new AtomicBoolean(false) ;

    /**
     * @return whether the value is set already
     */
    public boolean isDone() {
        return isValueSet;
    }

    /**
     * @return get the value, if value is not set, block until it is set
     * @throws InterruptedException
     */
    public V get() throws InterruptedException {
        latch.await();
        return value;
    }

    /**
     * get the value within specified time
     * 
     * @param timeout
     * @param unit
     * @return
     * @throws InterruptedException
     * @throws TimeoutException
     */
    public V get(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException {
        latch.await(timeout, unit);
        return value;
    }

    /**
     * binding value to this future
     * 
     * @param toBeSet
     */
    public void set(V toBeSet) {
      if(isDone.compareAndSet(false, true)){
          this.value = toBeSet;
          latch.countDown();
        } else {
                throw new IllegalStateException("value is set already");
        }
    }

}
 

 


 

下面是一个silly的使用程序

 

 

package org.jilen.cookie.concurrent;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

public class WaitForValueFutureTest {

    public static void main(String... args) {
        Client sample = new Client();
        Object message = sample.getValueFromSomewhere();
        System.out.println(message);
    }
}

class Client {

    private static Map<Object, WaitForValueFuture<Object>> resultMap   = new ConcurrentHashMap<Object, WaitForValueFuture<Object>>();
    private static AtomicInteger                           idGenerator = new AtomicInteger(0);

    public Object getValueFromSomewhere() {
        //generate a request id, thus after receive response, the value can be set to the future in the result with this key
        Integer requestId = idGenerator.getAndDecrement();
        WaitForValueFuture<Object> future = new WaitForValueFuture<Object>();
        resultMap.put(requestId, future);
        sendGetRequest(requestId, "hello");

        try {
            return future.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //prevent memory leak
            resultMap.remove(requestId);
        }
        return null;
    }

    private void sendGetRequest(Integer requestId, Object message) {
        System.out.println("peformming get request");

        //may be sent request to remote server,just sleep instead
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //within an nio application, this method may be invoke while read event happend
        receiveResponse(requestId, "hello world");
    }

    private void receiveResponse(Integer requestId, Object message) {
        //fill the result
        resultMap.get(requestId).set(message);
    }
}
1
0
分享到:
评论
1 楼 jilen 2011-08-10  
update 0.1 使用atomic boolean 来保证只set一次。

相关推荐

    countdownlatch-example-sourcecode.zip

    CountDownLatch是Java并发编程中一个非常重要的同步工具类,它在多线程协作场景中起到了关键的作用。在`countdownlatch-example-sourcecode.zip`这个压缩包中,我们可以看到一些关于CountDownLatch实际应用的示例...

    计算机后端-Java-Java高并发从入门到面试教程-课程准备.zip

    Java是企业级应用开发的重要选择,尤其是在大型分布式系统中,其强大的并发处理能力是关键特性之一。下面将详细阐述相关知识点。 1. **并发基础** - **线程与进程**:理解线程与进程的区别,线程是程序执行的最小...

    同步线程的应用---java

    4. **java.util.concurrent** 包:这个包提供了高级并发工具,如Semaphore(信号量)、CyclicBarrier(回环栅栏)、CountDownLatch(计数器门栓)等,可以帮助开发者更灵活地控制线程同步。 四、死锁和避免策略 ...

    计算机后端-Java-Java高并发从入门到面试教程-发课程资料.zip

    这个课程资料主要涵盖了从基础知识到面试必备的Java并发知识体系。以下是对这些主题的详细讲解: 1. **并发基础** - **线程与进程**:了解操作系统中的线程和进程概念,它们之间的区别以及在多任务环境下的作用。 ...

    计算机后端-Java-Java高并发从入门到面试教程-课程总结.zip

    这个“计算机后端-Java-Java高并发从入门到面试教程”旨在帮助初学者和有经验的开发者们掌握Java并发的核心概念,并提升到能够应对专业面试的水平。 一、并发基础 1. 并发概述:理解并发与并行的区别,了解多线程在...

    计算机后端-Java-Java高并发从入门到面试教程-存思路.zip

    Java高并发编程是Java开发中的核心技能之一,尤其在大型互联网和企业级应用中尤为重要。本教程旨在帮助初学者从入门到深入理解Java高并发,并为面试做好充分准备。以下是一些关键知识点的概述: 1. **并发基础** -...

    计算机后端-Java-Java高并发从入门到面试教程-可.zip

    本教程将引导你从零基础开始,逐步掌握Java并发编程的核心概念和技术,助你在面试中脱颖而出,提升职场竞争力。 首先,我们需要理解什么是并发。并发是指在一段时间内,多个任务看似同时进行的状态。在Java中,实现...

    计算机后端-Java-Java高并发从入门到面试教程-容思路.zip

    接下来,我们要探讨Java并发工具类,如Semaphore信号量、CyclicBarrier回环栅栏、CountDownLatch倒计时器等,这些工具可以帮助我们更好地管理和协调并发任务。例如,Semaphore用于限制同时访问特定资源的线程数量,...

    计算机后端-Java-Java高并发从入门到面试教程-用拆分思路.zip

    3. **并发容器**:Java并发库中的`ConcurrentHashMap`、`CopyOnWriteArrayList`、`LinkedBlockingQueue`等容器在设计时就考虑了并发安全,可以高效地在多线程环境中使用。 4. **锁机制**:Java中的锁包括内置锁(`...

    A-JUC-JVM-Java并发知识..pdf

    Java并发编程包(java.util.concurrent,简称JUC)封装了大量用于高并发编程的工具类和接口,其中涉及了线程池、阻塞队列、同步器、原子操作类等。在并发环境下,可以有效降低线程创建和管理的复杂性。 #### Java...

    计算机后端-Java-Java高并发从入门到面试教程-.C组件拓展.zip

    1. **Java并发基础**:学习Java并发,首先要理解线程和进程的概念,以及它们的区别。Java提供了多线程支持,通过`Thread`类和`Runnable`接口实现。同时,Java并发API包括`ExecutorService`、`Future`、`Callable`等...

    Java 并发编程实战.pdf

    根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...

    计算机后端-Java-Java高并发从入门到面试教程-用限流思路.zip

    Java 提供了许多并发编程的工具和框架,如 ExecutorService、Semaphore、CountDownLatch、CyclicBarrier 等,帮助开发者设计出能够高效处理并发的系统。 限流是一种控制服务处理速率的策略,通过限制系统的吞吐量或...

    Java 多线程与并发(2-26)Java 并发 - 线程基础.pdf

    Java多线程与并发是Java编程中至关重要的一个领域,特别是在构建高性能、高并发的应用时。线程基础是理解并发编程的关键,它涉及到线程的状态转换、创建与使用方式、同步与协作机制等方面。 线程有五种基本状态: 1...

    计算机后端-Java-Java高并发从入门到面试教程-务降级与服.zip

    接下来,面试中常问到的Java并发相关知识点包括: 1. **线程同步**:了解synchronized关键字,volatile变量,以及Lock接口(如ReentrantLock)的使用。 2. **并发容器**:如ConcurrentHashMap、...

    java并发编程实战源码,java并发编程实战pdf,Java

    《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...

    韩顺平.循序渐进学.java.从入门到精通--------java笔记完整版

    9. **线程与并发**:讲解了Java多线程编程,包括线程的创建、同步、死锁问题,以及并发工具类如Semaphore、CountDownLatch、CyclicBarrier等。 10. **反射机制**:Java反射机制允许在运行时动态地获取类的信息并...

    Java并发编程实践.pdf

    ### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 ...通过上述知识点的学习,我们可以更好地理解和掌握Java并发编程的基本原理和技巧,为开发高效稳定的并发应用程序打下坚实的基础。

    java-java面试题库整理-基础-JVM-线程并发-框架等.zip

    - 并发工具类:了解ConcurrentHashMap、CountDownLatch、CyclicBarrier、Semaphore等并发工具的用法。 4. **框架** - Spring框架:理解依赖注入(DI)和面向切面编程(AOP),掌握Spring MVC和Spring Boot的应用...

    JAVA 编程 API基础 JAVA开发平台,JAVA编程资源----JAVA API.zip

    开发者可以通过创建Thread对象或者实现Runnable接口来启动新线程,`java.util.concurrent`包提供了高级并发工具,如ExecutorService、Semaphore和CountDownLatch等。 5. **I/O与NIO**:`java.io`提供了传统的输入...

Global site tag (gtag.js) - Google Analytics