Java深入学习(4):Future模式
2019-10-08 09:17:41来源:博客园 阅读 ()
Java深入学习(4):Future模式
Future模式:
其实相当于是前端的Ajax
比如我们使用多线程下载文件时候,每一个线程都会发送HTTP请求资源。而我如何知道,文件下载完毕呢?
也就是说,主线程如何获得子线程的执行结果呢?
创建多线程中的实现runnable接口方式和继承thread类,然后start方法都是直接执行代码的,无法知道执行的结果(主线程无法知道进度)。
这里要说的是新方式:使用Callable接口和Future模式
public class CallableTest { public static void main(String[] args) throws Exception { ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); Future<String> submit = newCachedThreadPool.submit(new TaskCallable()); System.out.println("主线程运行"); String result = submit.get(); System.out.println(result); } } class TaskCallable implements Callable { @Override public String call() throws Exception { System.out.println("开始执行任务"); Thread.sleep(3000); System.out.println("执行任务结束"); return "success"; } }
打印:
主线程运行
开始执行任务
执行任务结束
success
Future模式核心:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑
Future模式实例:对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等到B有结果时再取真实的结果
自己实现Future模式:
/** * 公共Data数据结果 */ public abstract class Data { /** * 返回线程的执行结果 * @return String */ public abstract String getRequest(); }
/** * 获取真实数据 */ public class RealData extends Data { private String result; RealData(String data) { System.out.println("正在使用data->" + data + " 进行网络请求"); try { Thread.sleep(3000); } catch (Exception e) { e.printStackTrace(); } System.out.println("操作执行完毕"); this.result = "success"; } @Override public String getRequest() { return result; } }
/** * 当有线程要获取RealData的时候 * 程序会被阻塞 * 等到RealData被注入才会使用getRequest方法 */ public class FutureData extends Data { private boolean FLAG = false; private RealData realData; /** * 读取Data数据 */ public synchronized void setRealData(RealData realData) { //如果获取到数据直接返回 if (FLAG) { return; } //如果没有获取到数据 this.realData = realData; FLAG = true; notify(); } @Override public synchronized String getRequest() { while (!FLAG) { try { wait(); } catch (Exception e) { e.printStackTrace(); } } return realData.getRequest(); } }
public class FutureClient { public Data submit(String requestData){ FutureData futureData = new FutureData(); new Thread(new Runnable() { @Override public void run() { RealData realData = new RealData(requestData); futureData.setRealData(realData); } }).start(); return futureData; } }
测试类:
public class Main { public static void main(String[] args) { FutureClient futureClient = new FutureClient(); Data request = futureClient.submit("666"); System.out.println("主线程数据发送成功"); System.out.println("主线程执行其他任务"); String result = request.getRequest(); System.out.println(result); } }
打印如下:
主线程数据发送成功 主线程执行其他任务 正在使用data->666 进行网络请求 操作执行完毕 success
原文链接:https://www.cnblogs.com/xuyiqing/p/11625130.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Java网络编程 -- Netty中的ByteBuf
下一篇:Java反射
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash