传统的是继承thread类和实现runnable接口,java5以后又有实现callable接口和java的线程池获得
(1)是否有返回值 callable有
(2)是否抛异常 callable有
(3)落地方法不一样,一个是run,一个是call
创建新类MyThread实现runnable接口
class MyThread implements Runnable{
@Override
public void run() {
}
}
新类MyThread2实现callable接口
class MyThread2 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
return 200;
}
}
不可行,因为:thread类的构造方法根本没有Callable
解决方案
这像认识一个不认识的同学,我可以找中间人介绍。
中间人是什么?java多态,一个类可以实现多个接口!!
//使用Callable创建一个
FutureTask<Integer> futureTask = new FutureTask<>(() -> {
System.out.println(Thread.currentThread().getName() + "come in callable");
//设置返回值
return 1024;
});
//FutureTash 是Runnable的实现类
new Thread(futureTask,"AA").start();
运行成功后如何获得返回值?
System.out.println(futureTask.get());
未来的任务,用它就干一件事,异步调用
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)高考:会做的先做,不会的放在后面做