创建线程的四种方式
1.实现Thread类
2.继承Runnable接口
3.继承Callable接口
4.线程池
对于Runnable和Callable接口
Runnable接口不能得到方法的返回值,但Callable接口可以得到返回值,并可以得到方法的异常
我们来实现一下这两个接口
对于Runnable接口,可以直接实现
class Thread implements Runnable{
@Override
public void run() {
System.out.println("hello");
}
}
new Thread(new Thread1(),"aa").start();
但Runnable接口是一个函数式接口,可以用匿名实现类
new Thread(()->{
System.out.println("hello");
},"bb").start();
但对于Callable接口来说就不行了
这时就要用到设计模式中的适配器模式,有这么一个类FutureTask它实现了Runnable接口,并且在构造器中有Callable接口
而对于FutureTask未来任务,就是当不影响主线程的情况下,可以多开几个线程做2其他工作,最后汇总
就像是,一份卷子,我们先做会的,再做不会的
代码实现:由于Callabl接口也实现了函数式接口,所以也可以是lambda表达式
new Thread(new FutureTask<Integer>(()-> {
System.out.println("hello");
return 12;
}),"aa").start();
来检测一下,当没有完成就一直等待,完成后就进行一个输出
new Thread(hello,"aa").start();
while (!hello.isDone()){
System.out.println("wait");
}
System.out.println(hello.get());
结果: