原创

【JAVA】java中Future、FutureTask的使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://xxlcube.blog.csdn.net/article/details/47152565

现在的系统基本都是分布式的,各个系统各司其职的,不可能一个系统干了所有系统的事。

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


比如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



文章最后发布于: 2015-07-30 16:52:46
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 酷酷鲨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览