实现多线程的三种方法:
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方法,只会被执行一次,因为返回值已经保存记住了。