一、 实现线程前两种方式的缺点
1) 没有返回值
2) 不支持泛型
3) 异常必须处理
二、实现多线程的第三种方式
实现 Callable 接口,重写 call 方法
Callable 功能更加强大
1) Future 接口位于 java.util.concurrent 包中,可以对具体 Runnable、 Callable 任务的执行结果进行取消(cancel 方法, 尝试取消执行此任务)、查询是否完成(isDone 方法)、获取 结果(get 方法,等待完成,然后检索其结果)等。
2) FutrueTask 是 Futrue 接口的唯一的实现类
3) FutureTask 同时实现了 Runnable,Future 接口。它既可以 作为 Runnable 被线程执行,又可以作为 Future 得到 Callable 的返回值
1 import java.util.concurrent.Callable; 2 import java.util.concurrent.ExecutionException; 3 import java.util.concurrent.FutureTask; 4 5 /** 6 * ClassName:MyCallable 7 * date: 2020/4/17 12:16 8 * 9 * @author 王鼎禹 10 */ 11 public class MyCallable implements Callable<String> { 12 public static void main(String[] args) throws ExecutionException, InterruptedException { 13 //(1)创建任务 14 MyCallable call = new MyCallable(); 15 //(2)交能任务管理 16 /**任务管理器是一个实现类,实现了RunnableFutrue接口, 17 * RunnableFutrue是Futrue与Runnable接口的子接口*/ 18 FutureTask<String> task = new FutureTask<>(call); 19 //创建代理类并启动线程 20 new Thread(task).start(); 21 System.out.println("获取结果:"+task.get()); 22 //判断任务是否执行完成 23 System.out.println("任务是否执行完成:"+task.isDone()); 24 } 25 @Override 26 public String call() throws Exception { 27 String[] str = {"王一一","乔二二","张三三","刘六六","马五五"}; 28 int index = (int)(Math.random()*5); 29 return str[index]; 30 } 31 }