网络程序(或在其他异步的程序)由于是异步返回结果的,通常需要阻塞线程直到结果返回,这个时候,下面的代码就有用了。
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);
}
}
分享到:
相关推荐
CountDownLatch是Java并发编程中一个非常重要的同步工具类,它在多线程协作场景中起到了关键的作用。在`countdownlatch-example-sourcecode.zip`这个压缩包中,我们可以看到一些关于CountDownLatch实际应用的示例...
Java是企业级应用开发的重要选择,尤其是在大型分布式系统中,其强大的并发处理能力是关键特性之一。下面将详细阐述相关知识点。 1. **并发基础** - **线程与进程**:理解线程与进程的区别,线程是程序执行的最小...
4. **java.util.concurrent** 包:这个包提供了高级并发工具,如Semaphore(信号量)、CyclicBarrier(回环栅栏)、CountDownLatch(计数器门栓)等,可以帮助开发者更灵活地控制线程同步。 四、死锁和避免策略 ...
这个课程资料主要涵盖了从基础知识到面试必备的Java并发知识体系。以下是对这些主题的详细讲解: 1. **并发基础** - **线程与进程**:了解操作系统中的线程和进程概念,它们之间的区别以及在多任务环境下的作用。 ...
这个“计算机后端-Java-Java高并发从入门到面试教程”旨在帮助初学者和有经验的开发者们掌握Java并发的核心概念,并提升到能够应对专业面试的水平。 一、并发基础 1. 并发概述:理解并发与并行的区别,了解多线程在...
Java高并发编程是Java开发中的核心技能之一,尤其在大型互联网和企业级应用中尤为重要。本教程旨在帮助初学者从入门到深入理解Java高并发,并为面试做好充分准备。以下是一些关键知识点的概述: 1. **并发基础** -...
本教程将引导你从零基础开始,逐步掌握Java并发编程的核心概念和技术,助你在面试中脱颖而出,提升职场竞争力。 首先,我们需要理解什么是并发。并发是指在一段时间内,多个任务看似同时进行的状态。在Java中,实现...
接下来,我们要探讨Java并发工具类,如Semaphore信号量、CyclicBarrier回环栅栏、CountDownLatch倒计时器等,这些工具可以帮助我们更好地管理和协调并发任务。例如,Semaphore用于限制同时访问特定资源的线程数量,...
3. **并发容器**:Java并发库中的`ConcurrentHashMap`、`CopyOnWriteArrayList`、`LinkedBlockingQueue`等容器在设计时就考虑了并发安全,可以高效地在多线程环境中使用。 4. **锁机制**:Java中的锁包括内置锁(`...
Java并发编程包(java.util.concurrent,简称JUC)封装了大量用于高并发编程的工具类和接口,其中涉及了线程池、阻塞队列、同步器、原子操作类等。在并发环境下,可以有效降低线程创建和管理的复杂性。 #### Java...
1. **Java并发基础**:学习Java并发,首先要理解线程和进程的概念,以及它们的区别。Java提供了多线程支持,通过`Thread`类和`Runnable`接口实现。同时,Java并发API包括`ExecutorService`、`Future`、`Callable`等...
根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...
Java 提供了许多并发编程的工具和框架,如 ExecutorService、Semaphore、CountDownLatch、CyclicBarrier 等,帮助开发者设计出能够高效处理并发的系统。 限流是一种控制服务处理速率的策略,通过限制系统的吞吐量或...
Java多线程与并发是Java编程中至关重要的一个领域,特别是在构建高性能、高并发的应用时。线程基础是理解并发编程的关键,它涉及到线程的状态转换、创建与使用方式、同步与协作机制等方面。 线程有五种基本状态: 1...
接下来,面试中常问到的Java并发相关知识点包括: 1. **线程同步**:了解synchronized关键字,volatile变量,以及Lock接口(如ReentrantLock)的使用。 2. **并发容器**:如ConcurrentHashMap、...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
9. **线程与并发**:讲解了Java多线程编程,包括线程的创建、同步、死锁问题,以及并发工具类如Semaphore、CountDownLatch、CyclicBarrier等。 10. **反射机制**:Java反射机制允许在运行时动态地获取类的信息并...
### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 ...通过上述知识点的学习,我们可以更好地理解和掌握Java并发编程的基本原理和技巧,为开发高效稳定的并发应用程序打下坚实的基础。
- 并发工具类:了解ConcurrentHashMap、CountDownLatch、CyclicBarrier、Semaphore等并发工具的用法。 4. **框架** - Spring框架:理解依赖注入(DI)和面向切面编程(AOP),掌握Spring MVC和Spring Boot的应用...
开发者可以通过创建Thread对象或者实现Runnable接口来启动新线程,`java.util.concurrent`包提供了高级并发工具,如ExecutorService、Semaphore和CountDownLatch等。 5. **I/O与NIO**:`java.io`提供了传统的输入...