取得子线程的返回值(Future 搭载Callable)

其实大部分的时候子线程结束时不需要返回值,使用 new Thread(Runnable) 或者 多线程搭载Runnable的模式就行

但是如果需要返回值的时候,就很麻烦,要用外部变量控制流程,或者新增接口监听等。

当到了java1.5之后,就可以用Future搭载 Callable的方式来简单解决!

贴上代码:

public class CallableFutureTest 
{
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void main(String[] args) throws ExecutionException,
	InterruptedException {


		//创建一个线程池
		ExecutorService pool = Executors.newFixedThreadPool(1);

		//创建两个有返回值的任务
		Callable mCallable = new CallableImpl("线程AAAA");

		//执行任务并获取Future对象
		Future mFuture = pool.submit(mCallable);		

		//从Future对象上获取任务的返回值,并输出到控制台
		System.out.println(">>>" + mFuture.get().toString());

		//关闭线程池
		pool.shutdown();
	}

	@SuppressWarnings("rawtypes")
	class CallableImpl implements Callable {
		private String name;

		CallableImpl(String name) {
			this.name = name;
		}

		public Object call() throws Exception {
			return name + "线程返回的内容";
		}
	}
}

代码分析:

 

首先,实现一个Callable 的接口CallableImpl, 看名字就有点类似Runnable。 Callable的接口会实现一个call函数,就是通过这个函数就是返回返回值。

 

其次, 新建一个线程池

//创建一个线程池

ExecutorService pool = Executors.newFixedThreadPool(1);

 

第三 ,实现一个Callable的对象,通过new CallableImpl来实现

//创建两个有返回值的任务

Callable mCallable = test.new CallableImpl("线程A");

 

第四, Callable 的对象也就是mCallable 放到线程池中

//执行任务并获取Future对象

Future mFuture = pool.submit(mCallable);

这个submit会返回Future类型的对象

 

第五 通过 mFuture.get()就取到返回值了

//Future对象上获取任务的返回值,并输出到控制台

System.out.println(">>>" + mFuture.get().toString());

 

 

最后,记得要关闭线程池哦!

//关闭线程池

pool.shutdown();


其实还有一个叫FutureTask的方法,事实上FutureTaskJDK中对Future接口的唯一实现

FutureTaskFuture的用法区别是不需要通过submit的返回值!


譬如将上面的代码中要把第四步的:

Future mFuture = pool.submit(mCallable);

换成

FutureTask<String> mFutureTask = new FutureTask<String>(mCallable);

pool.submit(mFutureTask);

就行

同样可以通过mFutureTask.get()取得返回值! 


总结:

FutureTask 的作用其实就是将 Callable对象打包到FutureTask中来。

看上去好像更面向对象了,呵呵!



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值