Thread类和实现Runnable接口的线程类是没有返回值的,都是重写它们的run()方法,对比这两个创建线程的方式发现,这个run()方法有不足:
1.没有返回值
2.不能抛出异常
基于上面的两个不足,在JDK1.5以后出现了第三种创建线程的方式:实现Callable接口:
实现Callable接口的好处:1.有返回值 2.能抛出异常
缺点:线程创建比较麻烦
public class MyThread implements Callable<Integer> {
/**
* 创建第三种线程方式
*
* 实现Callable接口并重写call()方法
* 1.可不带泛型,如果不带泛型,那么call方法的返回值类型就是Object类型
* 2.带泛型,那么call方法返回值类型对应的类型
* 3.从call方法看到,方法有返回值,可以抛出异常
*/
@Override
public Integer call() throws Exception {
return new Random().nextInt(10);//返回10以内的随机数
}
}
测试类
public static void main(String[] args) throws ExecutionException, InterruptedException {
//定义一个线程对象
MyThread mt = new MyThread();
/*定义了线程后,得启动线程start(),故new Thread()启动线程
*但new Thread()没有实现Callable接口
* 通过底层源码知道,new Thread()可以接受Runnable接口的
* 故通过FutureTask类接收Callable,FutureTask又是实现Runnable接口的
* 再Thread接收FutureTask实现类
* */
FutureTask ft = new FutureTask(mt);
Thread t = new Thread(ft);
t.start();
//获取线程得到的返回值:
Object obj =ft.get();
System.out.println(obj);
}