Java多线程实现方式主要有四种:
继承Thread类,重写run方法、实现Runnable接口,重写run方法,实现Run nable接口的实现类的实例对象作为Thread构造函数的target、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程(线程池)。
其中前两种方式线程执行完后都没有返回值,原因很简单,通过重写run方法,run方式的返回值是void,所以没有办法返回结果。后两种是带返回值,通过Callable接口,就要实现call方法,这个方法的返回值是Object,所以返回的结果可以放在Object对象中。
继承Thread类的线程
|
|
输出结果:
通过实现Runnable接口、实现run方法,接口的实现类的实例作为Thread的target作为参数传入带参的Thread构造函数,通过调用start()方法启动线程。
|
|
输出结果:
通过Callable和FutureTask创建线程
a: 创建Callable接口的实现类,并实现Call方法
b: 创建Callable实现类的实现,使用FutureTask类包装Callable对象,该FutureTask对象封装了Callable对象的Call方法的返回值
c: 使用FutureTask对象作为Thread对象的target创建并启动线程
d: 调用FutureTaske对象的get()来获取子线程执行结束的返回值
输出结果:
通过线程池创建线程
|
|
输出结果:
ExecutorService、Callable都是属于Executor框架。返回结果的线程是在JDK1.5中引入的新特征,还有Future接口也是属于这个框架。