实现多线程的三种方法:
1,继承Thread,重写run()方法,调用start()方法启动线程;
2,实现Runnable接口,实现run()方法,用new Thread(Runnable target).start()方法启动相应线程;
3,实现Callable接口,使用FutureTask包装器,实现call()方法,而且call()方法有返回值,可以抛出异常;
1 //实现Callable接口 2 class Test implements Callable<Integer> { 3 4 @Override 5 public Integer call() throws Exception { 6 return 1024; 7 } 8 }
Callable接口与Runnable接口的区别:
(1),是否有返回值
(2),是否抛异常
(3),要实现的方法不一样,一个是run,一个时call方法
实现Callable接口的多线程实现方法:
1 import java.util.concurrent.Callable; 2 import java.util.concurrent.ExecutionException; 3 import java.util.concurrent.FutureTask; 4 5 public class ThreadPro { 6 public static void main(String[] args) throws ExecutionException, InterruptedException { 7 Test test=new Test(); 8 FutureTask futureTask=new FutureTask(test); 9 new Thread(futureTask,"A线程").start(); 10 System.out.println("......"); 11 System.out.println(futureTask.get()); 12 } 13 } 14 15 //实现Callable接口 16 class Test implements Callable<Integer> { 17 18 @Override 19 public Integer call() throws Exception { 20 System.out.println("HELLO!......"); 21 return 1024; 22 } 23 }
Thread类没有可以直接传入Callable接口的构造器,需要使用实现了Runnable接口,含有Callable接口构造器的包装类futureTask类。
引入Callable接口具有哪些好处:
(1),可以获得任务执行返回值;
(2),通过与FutureTest的结合,可以实现利用FutureTest来跟踪异步计算的结果。并且多个线程执行同一个类的call方法,只会被执行一次,因为返回值已经保存记住了。