1、Callable与Runnable的区别

-是否有返回值
-是否抛出异常
-实现方法名称不同,一个是run方法,一个是call方法

2、Callable接口创建线程-FutureTask

错误的方式:

  1. new Thread(new MyRunnable(),"Runnable接口");
  2. //会报错
  3. //new Thread(new MyCallable(),"Callable接口");
  1. FutureTask<Integer> futureTask=new FutureTask<>(new MyCallable());
  2. //使用Lam表达式改进
  3. FutureTask<Integer> futureTask1=new FutureTask<>(()->{
  4. return 1024;
  5. });
  6. //创建并启动线程
  7. new Thread(futureTask1,"Callable线程1").start;
  8. new Thread(futureTask1,"Callable线程2").start;
  9. //判断线程是否已经结束
  10. while(!futureTask1.isDone()){
  11. System.out.println("wait.....");
  12. }
  13. System.out.println(futureTask1.get());//获取线程的返回值