04 |
您所在的位置:网站首页 › callable接口lambda › 04 |
【简述】 从java5开始,java提供了Callable接口,这个接口可以是Runnable接口的增强版, Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能更强大。
【call()方法特点】 1.call()方法可以有返回值 2.call()方法可以声明抛出异常。
【Future接口】 java5提供了Future接口来代表Callable接口里的call()方法的返回值,并为Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并实现了Runnable接口,所以这样可以作为Thread的target。 在Future接口里定义了一下公共方法来控制它关联的Callable任务。 1. boolean cancel( boolean mayInterruptRunning):试图取消该Future里关联的Callable任务。 2. V get() :返回Callable任务里call()方法的返回值。调用该方法会导致程序阻塞,必须等到子线程结束后才会得到返回值。 3. V get( long timeout, TimeUnit unit ):返回Callable任务里call方法的返回值。该方法然程序最多阻塞timeout和unit指定的时间,如果时间到了Callable没返回值,抛TimeoutException异常。 4.boolean isCancelled():如果Callable任务正常完成前被取消,返回true。 5.boolean isDone():如果Callable任务已完成,则返回true。
【创建和启动线程的步骤】 1.创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,且该call()方法没有返回值,再创建Callable实现类的实例。(从java8开始,可以直接使用Lambda表达式创建Callable对象)。 2.使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。 3.使用FutureTask作为Thread对象的target创建并启动新线程。 4.调用FutureTask对象的get方法来获得子线程执行结束后的返回值。
【示例代码】 package com.Higgin.part01; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; class ThirdThread { } public class Demo3 { public static void main(String[] args) { //创建Callable对象 ThirdThread rt=new ThirdThread(); //先使用Lambda表达式创建Callable对象, //并使用FutureTask来包装Callable对象 FutureTask task=new FutureTask((Callable)()->{ int i=0; for(;i |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |