1 接口定义
1) Callable接口
- public interface Callable<V> {
- V call() throws Exception;
- }
2) Runnable接口
- public interface Runnable {
- public abstract void run();
- }
2 不同点和相同点
1)相同点
都是接口,都可编写多线程程序,都是调用Thread.start()启动线程
2)不同点
Callable可以返回执行结果,是个泛型,与Future、FutureTask配合可以通过FutureTask.get()获取异步执行的结果,但是Runnable不可以。
Callable里面有取消这个任务,而且异常可以外抛,但是Runnable异常只能内部run消化。
FutureTask.get()得到异步执行的结果,此方法会阻塞主进程的继续往下执行。
3 Callable测试用例
- import java.util.Random;
- import java.util.concurrent.Callable;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.FutureTask;
-
- public class TestCallableAndFuture {
- public static void main(String[] args) {
-
- //构建Callable
- Callable<String> callable = new Callable<String>() {
- @Override
- public String call() throws Exception {
- Thread.sleep(2000);
- return "chenyu callable finish";
- }
- };
-
- //构建FutureTask
- FutureTask<String> futureTask = new FutureTask<>(callable);
-
- //运行线程
- new Thread(futureTask).start();
-
- try {
- System.out.println("chenyu begin");
- System.out.println(futureTask.isDone());
- //futureTask.cancel(true);
- if (!futureTask.isCancelled()) {
- System.out.println(futureTask.get());
- System.out.println(futureTask.isDone());
- System.out.println("chenyu end");
- } else {
- System.out.println("the thread is cancel");
- }
-
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
- }
- }
-
4 运行结果
如果注释掉// futureTask.cancel(true)运行结果如下
- chenyu begin
- false
- chenyu callable finish
- true
- chenyu end
如果不注释掉futureTask.cancel(true)运行结果如下
- chenyu begin
- false
- the thread is cancel