thread|Java多线程和线程池的执行流程

thread|Java多线程和线程池的执行流程

Java多线程的实现方式主要有四种:继承Thread类 , 实现Runnable接口 , 实现Callable接口通过FutureTask包装器创建Thread线程 , 使用ExecutorService、Callable、Future实现多线程并返回结果 。
其中 , 前两个方法在线程执行后没有返回值 , 后两个有返回值 。
1、继承Thread类并重写run方法
(其实Thread类本身也实现了Runnable接口)
public class MyThread extends Thread {
public void run() {
System.out.println(\"MyThread.run()\");


MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();
myThread2.start();
?
2、实现Runnable接口并重写run方法
public class CreatesDemo2 {
public static void main(String[
args) {
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();

class MyRunnable implements Runnable {
public void run() {
【thread|Java多线程和线程池的执行流程】System.out.println(\"通过Runnable创建的线程!\");

以上两种创建方法在工作上具有相同的性质 。但是推荐使用Runable接口方法 。解决单继承的局限性 。 以下两种方式是jdk1.5新增的!
?
3、实现Callable接口并重写 调用方法(带返回值)
如何启动线程?
(1) 创建Callable接口的实现类对象
(2) 创建FutureTask对象 , 并传入Callable类型参数
[Future callable
{Callable<V>

(3) 调用Thread类重载参数为Runnable的构造函数创建Thread对象
传递FutureTask作为参数 >
如何获取返回值?
调用FutureTask类的get()方法
注:
与Runnable 相比 , Callable 具有更强大的功能 。
实现的 call() 方法可以返回一个值 。
该方法可以抛出异常 。
支持通用返回值
需要 FutureTask 类 。例如返回结果
Future接口可以取消特定Runnable和Callable任务的执行结果 , 检查查询是否完成 , 并获取结果 。
FutureTask 是 Futrue 接口的唯一实现类 。
FutureTask 同时实现了 Runnable 和 Future 接口 。可以作为Runnable被线程执行 , 也可以作为Future来获取Callable的返回值
?
4.使用线程池(带返回值)
说明:
提前创建多个线程 , 放入线程池中 , 使用时直接获取 , 使用后放回线程池中 。可以避免频繁的创建和销毁 , 实现复用 。类似于生活中的公共交通 。
好处:
提高响应速度(减少创建新线程的时间)
减少资源消耗(重用线程池中的线程 , 不需要每次都创建)
方便线程 管理
?
如图:线程池的执行流程
?