废话不多说,直接看一下api里面对callable的解释:
Callable接口类似于Runnable ,因为它们都是为其实例可能由另一个线程执行的类设计的。 然而,A Runnable不返回结果,也不能抛出被检查的异常。
所以比起runable来说,callable有以下特点:
1、有返回值
2、可以抛出异常
3、方法不同,run(),call()
要使用callable还不能直接像runable一样,而是要借助futureTask
代码如下:
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 {
//runable的方法去使用
new Thread(new MyRunable()).start();
//callable
MyCallable myCallable = new MyCallable();
FutureTask task = new FutureTask(myCallable);
new Thread(task,"A").start();
System.out.println(task.get());
new Thread(task,"B").start();
System.out.println(task.get());
}
}
class MyRunable implements Runnable{
@Override
public void run() {
System.out.println("使用了一次runable方法");
}
}
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("调用了call方法");
return Thread.currentThread().getName();
}
}
输出结果如下:
使用了一次runable方法
调用了call方法
A
A
从输出结果我们可以得出,callable特点:
1、有缓存
2、结果可能需要等待,会阻塞!