1. Callable&Future接口
1.1 Callable接口
Callable接口创建线程可以有返回值。
1.2 Runable和Callable接口的区别
Runable | Callable | |
---|---|---|
是否有返回值 | 否 | 是 |
是否抛出异常 | 否 | 是 |
实现的方法名称 | run | call |
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class RunnableAndCallableDistinction {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//Runnable创建一个线程
new Thread(new MyThread1(), "AA").start();
//Callable接口创建一个线程
//FutureTask
/*futureTask(未来任务)原理:在不影响主线程运行的情况下,单开一个线程做别的事情,主线程要用直接从里面拿就可以了
* 1、老师上课,口渴了,去买水不合适,讲课这个线程继续。
* 2、单开启一个线程,找班上班长帮我买水
* 3、班长把水买回来就可以(get)喝了
* */
FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread2());
//lam表达式简化,因为Callable接口中只有一个实现方法(函数式接口),直接匿名对象实现即可
FutureTask<Integer> futureTask1 = new FutureTask<Integer>(() -> {
System.out.println(Thread.currentThread().getName() + " come in callable");
return 1024;
});
new Thread(futureTask1,"BB").start();
//isDone()表示任务是否完成
while (!futureTask1.isDone()){
System.out.println("wait...");
}
System.out.println(futureTask1.get());
System.out.println(futureTask1.get());//第二次获取时不需要在进行运算,直接返回结果
System.out.println(Thread.currentThread().getName() + " over");
}
}
class MyThread1 implements Runnable {
@Override
public void run() {
}
}
class MyThread2 implements Callable {
@Override
public Object call() throws Exception {
return null;
}
}