获得多线程的方式之通过Callable接口
先看一下Callable的接口源码
与Runnable接口的区别
- 1)Runnable接口没有返回值,该接口有返回值(带返回值的线程工作内容)
- 2)Runnable接口方法不会抛异常,该接口方法会抛异常
- 3)Runnable接口方法是run()方法,该接口的接口方法是call()方法
怎么使用Callable接口
- Thread有Thread(Runnable target) 的构造方法,但没有传callable的构造方法
- Runnable是Thread的一个实现接口
- RunnableFuture是Runnable的一个子接口
- FutureTask是RunnableFuture的一个实现类
- FutureTask(Callable callable)是FutureTask的一个构造方法
所以要通过FutureTask来实现
FutureTask类源码中FutureTask(Callable callable)的构造方法
具体实现代码示例:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 获得多线程的方式之通过Callable接口
*
*/
public class ThreadDemo {
/**
* FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread());
*/
public static void main(String[] args){
//传入一个自定义的实现了Callable接口的实现类,相当于new了一个Callable
FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread());
Thread thread = new Thread(futureTask);
thread.start();
try {
//futureTask.get()获得返回值
System.out.println(futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
/**
* 自定义一个了类实现Callable<>接口
*/
class MyThread implements Callable<Integer>{
//类泛型中定义什么返回值类型,该覆写方法就返回什么类型
@Override
public Integer call() throws Exception {
System.out.println("通过Callable实现多线程");
return 1024;
}
}
代码运行结果: