public  static Object send(RequestClient request)
future.channel().writeAndFlush(JSONObject.toJSONString(request));
future.channel().writeAndFlush("\r\n");
DefaultFuture defaultFuture = new DefaultFuture(request);//请求未来的响应
Response response = defaultFuture.get(10);//阻塞获取响应
return response;
return null;
}
public class ClientHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg)
Response res = JSONObject.parseObject(msg.toString(), Response.class);
DefaultFuture.recive(res);//拿到结果,通知阻塞解除
}
}
public class DefaultFuture {

    private long id;
public final static Map<Long,DefaultFuture> FUTURES= new ConcurrentHashMap<Long,DefaultFuture>();
private long timeout;
private final long start=System.currentTimeMillis(); //get方法和recive方法是不同线程调用的同一个对象,要volatile。
private volatile Response response;
private volatile Lock lock = new ReentrantLock();
private volatile Condition condition = lock.newCondition(); public DefaultFuture(){} public DefaultFuture(RequestClient request){
id=request.getId();//通过id进行异步判断,
FUTURES.put(id, this);//请求的id和响应对应。
} public Response get(){
lock.lock();
while(!hasDone()){
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
return response;
} //超时是防止服务器卡死了。
public Response get(long timeout){
long start = System.currentTimeMillis();
lock.lock();
while(!hasDone()){
try {//condition是依赖ReentrantLock
//此时当前线程释放lock锁,进入[等待状态],等待其他线程执行aCondition.signal()时才有可能执行
condition.await(timeout, TimeUnit.SECONDS);
if(System.currentTimeMillis()-start>=timeout){
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
return response;
} //收到服务器响应
public static void recive(Response res){
//找到res相对应的DefaultFuture
DefaultFuture future = FUTURES.remove(res.getId());
if(future==null){
return ;
}
Lock lock= future.getLock();
lock.lock();
try{
future.setResponse(res);
Condition condition = future.getCondition();
if(condition!=null){
condition.signal();
} }catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
} //开一条线程处理超时
static class FutureTimeOutThread extends Thread{
@Override
public void run() {
while(true){
for(long futureId : FUTURES.keySet()){
DefaultFuture f = FUTURES.get(futureId);
if(f==null){//等于空直接移除
FUTURES.remove(futureId);
continue;
}
if(f.getTimeout()>0){//不等于空判断是否超时
if((System.currentTimeMillis()-f.getStart())>f.getTimeout()){
Response res = new Response();
res.setContent(null);
res.setMsg("请求超时!");
res.setStatus(1);//响应异常处理
res.setId(f.getId());
DefaultFuture.recive(res);
}
}
}
}
}
} static{
FutureTimeOutThread timeOutThread = new FutureTimeOutThread();
timeOutThread.setDaemon(true);//守护线程,主线程在就在,主线程挂掉就挂掉,
timeOutThread.start();
} private boolean hasDone() {return response !=null? true:false;}
public long getId() {return id;}
public Response getResponse() {return response;}
public void setResponse(Response response) {this.response = response;}
public Lock getLock() {return lock;}
public void setLock(Lock lock) {this.lock = lock;}
public Condition getCondition() {return condition;}
public void setCondition(Condition condition) {this.condition = condition;}
public void setId(long id) {this.id = id;}
public long getTimeout() {return timeout;}
public void setTimeout(long timeout) {this.timeout = timeout;}
public long getStart() {return start;}
}

Future 示例的更多相关文章

  1. java多线程获取返回结果--Callable和Future示例

    package test.guyezhai.thread; import java.util.ArrayList; import java.util.Date; import java.util.Li ...

  2. java并发:获取线程执行结果(Callable、Future、FutureTask)

    初识Callable and Future 在编码时,我们可以通过继承Thread或是实现Runnable接口来创建线程,但是这两种方式都存在一个缺陷:在执行完任务之后无法获取执行结果.如果需要获取执 ...

  3. Akka系列(五):Java和Scala中的Future

    前言....... 随着CPU的核数的增加,异步编程模型在并发领域中的得到了越来越多的应用,由于Scala是一门函数式语言,天然的支持异步编程模型,今天主要来看一下Java和Scala中的Futrue ...

  4. HowToDoInJava Java 教程·翻译完成

    原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 核心 Java 教程 什 ...

  5. 一文带你了解J.U.C的FutureTask、Fork/Join框架和BlockingQueue

    摘要: J.U.C是Java并发编程中非常重要的工具包,今天,我们就来着重讲讲J.U.C里面的FutureTask.Fork/Join框架和BlockingQueue. 本文分享自华为云社区<[ ...

  6. 混合使用ForkJoin+Actor+Future实现一千万个不重复整数的排序(Scala示例)

    目标       实现一千万个不重复整数的排序,可以一次性加载到 2G 的内存里. 本文适合于想要了解新语言 Scala 并发异步编程框架 Akka, Future 的筒鞋. 读完本文后,将了解如何综 ...

  7. Java中的Runnable、Callable、Future、FutureTask的区别与示例

    Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. ...

  8. 【腾讯Bugly干货分享】WebVR如此近-three.js的WebVR示例解析

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ff1689a6c9121b1adb16 作者:苏晏烨 关于WebVR 最 ...

  9. java Future 接口介绍

    (转自:http://blog.csdn.net/yangyan19870319/article/details/6093481) 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java ...

随机推荐

  1. vue+node+mongodb前后端分离博客系统

    感悟 历时两个多月,终于利用工作之余完成了这个项目的1.0版本,为什么要写这个项目?其实基于vuejs+nodejs构建的开源博客系统有很多,但是大多数不支持服务端渲染,也不支持动态标题,只是做到了前 ...

  2. Spark SQL configuration

    # export by: spark.sql("SET -v").show(n=200, truncate=False) key value meaning spark.sql.a ...

  3. Fiddler 会话过滤功能

    我们访问任何网址都会被 Fiddler 捕获,但有时我们只想捕获某个地址,可以使用 Fiddler 的会话过滤,如下我们只过滤出百度的域名 如下,切换到 Filters --- 把 Use Filte ...

  4. Orders matters: seq2seq for set 实验

    论文提出了input的顺序影响seq2seq结果 有一些输入本身是无序的怎么去处理呢 作者提出LSTM controller的方式 替代输入的LSTM encode方式         作者实验这种方 ...

  5. Maven setting.xml 文件配置

    全局配置: ${M2_HOME}/conf/settings.xml (配置环境变量  新建 M2_HOME    安装目录到版本名那里(D:\apache-maven-3.0.2) 编辑path 环 ...

  6. STL next_permutation 算法原理和自行实现

    目标 STL中的next_permutation 函数和 prev_permutation 两个函数提供了对于一个特定排列P,求出其后一个排列P+1和前一个排列P-1的功能. 这里我们以next_pe ...

  7. vue的单向数据流

    父级向子组件传递的值, 子组件不能直接修改这个穿过来的值,否则会曝出警告,这就是单项数据流. 如果是引用值,传递的是引用值得地址,而不是值本身,也就是说,子组件里修改这个传过来的值,通常的做法是放到它 ...

  8. vue里的v-show和v-if

    v-show:false            对应的是display:none:不移除dom元素.对网页渲染性能更好,适应于频繁的操作该dom的显示隐藏. v-if:  false       对应 ...

  9. jQuery 中的 39 个技巧【申明:来源于网络】

    jQuery 中的 39 个技巧[申明:来源于网络] 地址:http://blog.csdn.net/zhongqi2513/article/details/53704812?ref=myread

  10. 洛谷P3384 【模板】树链剖分

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...