Callable
多线程中,第3种获得多线程的方式,Callable。它与Runnable有什么区别呢?
- 是否有返回值
- 是否抛出异常
- 方法不一样,一个是call,一个是run
基础入门
package demo4;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyThead myThead = new MyThead();
//FutureTask中的构造方法参数类型是Callable,myThead实现了Callable接口
// FutureTask实现了RunnableFuture接口,RunnableFuture接口继承了Runnable接口
//相当于FutureTask实现了Runnable接口
FutureTask futureTask = new FutureTask(myThead);//适配类
new Thread(futureTask,"A").start();//调用执行
String str = (String) futureTask.get();
System.out.println(str);
}
}
class MyThead implements Callable<String>{
@Override
public String call() throws Exception {
System.out.println("call()方法被调用");
return "123";
}
}
Callable细节
package demo4;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 1、get 方法获得返回结果! 一般放在最后一行!否则可能会阻塞
*/
public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyThead myThead = new MyThead();
FutureTask futureTask = new FutureTask(myThead);//适配类
new Thread(futureTask,"A").start();//调用执行
new Thread(futureTask,"B").start();//第二次调用执行,会有结果缓存,不用再次计算
System.out.println(Thread.currentThread().getName()+"OK");
String str = (String) futureTask.get();//获取返回值
System.out.println(str);
}
}
class MyThead implements Callable<String>{
@Override
public String call() throws Exception {
System.out.println("call()方法被调用");
return "123";
}
}