zoukankan      html  css  js  c++  java
  • 【JAVA】java中Future、FutureTask的使用

    如今的系统基本都是分布式的,各个系统各司其职的,不可能一个系统干了全部系统的事。

    所以系统之间的交互就越来越多了。那么系统之间的交互仅仅有通过网络来交互了,而网络必定会存在延时的情况。


    比方A系统的一个功能要实现,当中某一步要去B系统拿一个全局唯一的ID值,那么此时在A系统的功能实现中就会发生对B系统的调用。假设是同步调用的话,可能会影响性能


    String id = httpToB(url);

    这样写的话,就是传统的同步方式,会一直等待B系统给出响应后才会继续往下运行。可是现实中。可能不是这种。由于时间可能非常长。所以先来一个线程去B系统拿这个ID值。当前线程,继续像后运行,当运行到某一步须要用到这个ID值了,再来取


    这时候,就能够通过Future或者FutureTask来实现了。Future是接口,FutureTask是Future的一个详细实现类

    private static ThreadPoolExecutor poolExe = new ThreadPoolExecutor(100, 1000, 1,
    			TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(100));
    
    	private static Future<String> getUamKid() {
    		return poolExe.submit(new Callable<String>() {
    			public String call() throws Exception {
    				// TODO Auto-generated method stub
    				return sendHttpPostRequest("XXXXXXXXX", "");
    			}
    
    		});
    	}
    
    	public static void main(String a[]) throws Exception {
    		Future<String> future = getUamKid();
    		System.out.println("去B系统取ID,如今我能够做自己的事情了");
    		System.out.println("ID拿到了吗?" + future.isDone());
    		long counter = 0;
    		String uamKid = "";
    		while (!future.isDone()) {
    			counter++;
    			//System.out.println("我等。我等。我等等等...");
    		}
    		uamKid = future.get();
    		System.out.println("ID = " + uamKid);
    		System.out.println("进去等了多少次?" + counter);
    	}

    去B系统取ID,如今我能够做自己的事情了
    ID拿到了吗?false
    ID = 38176732481585156
    进去等了多少次?4318049299
    
    前面无数个等等等...

    能够看到了,等了4318049299这么多次,说明while循环了4318049299次才完毕啊。


    使用FutureTask的话,几乎相同。參照:http://blog.csdn.net/simonchi/article/details/8181571



  • 相关阅读:
    【玩转微信公众平台之二】 账号注冊
    SharePoint 2010 Form Authentication (SQL) based on existing database
    淘宝API学习之道:淘宝API相关了解
    Java中Map的使用
    ROADS+dijkstra的灵活运用+POJ
    Jquery Ajax时 error处理 之 parsererror
    P1719 最大加权矩形
    回文串
    P1816 忠诚
    P1725 琪露诺
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6891155.html
Copyright © 2011-2022 走看看