面试:获得多线程的方法有几种?
-
传统的继承 Thread类。
-
实现 Runnable 接口。
-
Java5 以后又有实现 Callable接口和 java线程池获得。
Callable接口介绍:
(1)java.util.concurrent.Callable是一个泛型接口,只有一个call()方法
(2)call()方法抛出异常Exception异常,且返回一个指定的泛型类对象
面试题:callable接口与runnable接口的区别?
(1)是否有返回值。 (2)是否抛异常。 (3)落地方法不一样,一个是run,一个是call。
Callable接口实现多线程的应用场景:
(1)当父线程想要获取子线程的运行结果时。
使用Callable接口实现多线程的步骤:
(1)第一步:创建Callable子类的实例化对象。
(2)第二步:创建FutureTask对象,并将Callable对象传入FutureTask的构造方法中。
(注意:FutureTask实现了Runnable接口和Future接口)
这像认识一个不认识的同学,我可以找中间人介绍。 中间人是什么?java多态,一个类可以实现多个接口!!
(3)第三步:实例化Thread对象,并在构造方法中传入FurureTask对象
(4)第四步:启动线程
FutureTask
new Thread(ft, "AA").start();
代码演示:
package juc; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; /** * 面试:实现多线的方法有几种? * * 多线程中 第 3 种获得多线程的方式 */ public class CallableDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask futureTask = new FutureTask(new MyThread()); new Thread(futureTask,"A").start(); new Thread(futureTask,"B").start(); System.out.println(futureTask.get()); } } class MyThread implements Callable{ @Override public Integer call() throws Exception { System.out.println("come in here"); return 1024; } }
直接替换runnable是否可行?
不可行,因为:thread类的构造方法根本没有Callable。
运行成功后如何获得返回值?
ft.get();
FutureTask
未来的任务,用它就干一件事,异步调用main方法就像一个冰糖葫芦,一个个方法由main串起来。但解决不了一个问题:正常调用挂起堵塞问题。
例子:
(1)老师上着课,口渴了,去买水不合适,讲课线程继续,我可以单起个线程找班长帮忙买水, 水买回来了放桌上,我需要的时候再去get。
(2)4个同学,A算1+20,B算21+30,C算31*到40,D算41+50,是不是C的计算量有点大啊, FutureTask单起个线程给C计算,我先汇总ABD,最后等C计算完了再汇总C,拿到最终结果
(3)高考:会做的先做,不会的放在后面做