JDK1.5开始,Java提供了Callable接口,此接口可以说是Runnable接口的增强版,但它不是Runnable的子接口,它是以call()方法作为线程执行体:
call()方法可以有返回值。
call()方法可以声明抛出异常。
由于不是Runnable的子接口,于是Callable对象就不能作为Thread的target,但是Java提供了另一个方法Future接口来代表Callable的call()方法的返回值,Future接口有一个实现类FutureTask,并且还实现了Runnable接口,于是就可以使用FutureTask对象最为Thread的target。
Future接口里定义了几个公共方法来关联对应的Callable任务:
boolean cancel(boolean mayInterruptRunning):试图取消该Future关联的Callable任务。
V get():返回Callable里call()方法的返回值。该方法会导致程序阻塞,必须等到子线程结束时才能得到返回值。
V get(long timeout,TimeUnit unit):返回Callable里call()方法的返回值。该方法最多让程序等待timeout和unit指定的时间,到达指定时间后还没有得到返回值,将会抛出TimeoutException异常。
boolean isCancelled():如果Callable任务在正常完成前被取消,则返回true。
boolean isDone():如果Callable任务已经完成,则返回true。
创建、启动有返回值的线程步骤:
1.创建Callable接口实现类,实现call()方法,call()方法作为线程执行体,有返回值。
2.创建Callable实现类的实例,并用FutureTask类来包装Callable对象,该Future对象封装了Callable对象的call()返回值。
3.让FutureTask的对象作为Thread的target新建一个线程并启动它。
4.通过FutureTask的对象的方法来获取子线程执行完后的返回值。
实现代码:
有返回值得线程 Future实现类FutureTsk用法 运行结果-------------上一节“Java-线程组”-------------------
--------------下一节“Java-线程池”------------------
网友评论