1.Callable与Runnable的区别(以下是Callable的特点)
- 有返回值 ---- 对应的Runnable无返回值
- 可以抛出异常 ---- 对应的Runnable不抛出异常
- 方法不同 call() ---- 对应的Runnable run()
2.使用区别
- Runnable使用
new Thread(new Runnable()).start();
- Callable使用
直接放到Thread是不允许的,两者没有直接联系,但是它跟Runnable有联系(就像你想认识你女朋友的闺蜜一样),所以可以通过Runnable的FutureTask来建立联系
3.代码实现
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// new Thread(new Runnable()).start();
// new Thread(new FutureTask<V>()).start();
// new Thread(new FutureTask<V>( Callable )).start();
new Thread().start(); // 怎么启动Callable
MyThread thread = new MyThread();
FutureTask futureTask = new FutureTask(thread); // 适配类
new Thread(futureTask,"A").start();
new Thread(futureTask,"B").start(); // 结果会被缓存,效率高
Integer o = (Integer) futureTask.get(); //这个get 方法可能会产生阻塞!把他放到最后
// 或者使用异步通信来处理!
System.out.println(o);
}
}
class MyThread implements Callable<Integer> {
@Override
public Integer call() {
System.out.println("call()"); // 会打印几个call
// 耗时的操作
return 1024;
}
}
5.注意
1、有缓存(两个线程只执行一次方法)
2、结果可能需要等待,会阻塞!