多线程(理论概述)

【思维导图】

 

【创建和启动】

(1)方法一:继承Thread类创建线程类

步骤:

(i)定义Thread子类,并重写该类的run()方法。(PS:该run()方法的方法体就代表了线程需要完成的任务。因此run()方法也称为线程执行体)

(ii)创建Thread子类的实例。即创建了线程的对象。

(iii)调用线程对象的start()方法来启动该线程。

 

(2)方法二:实现Runnable接口创建线程类

步骤:

(i)定义Runnable接口的实现类,并重写该接口的run()方法。该run()方法的方法体同样是该线程的线程执行体。

(ii)创建Runnable实现类的实例。并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

(iii)d调用线程对象的start()方法来启动该线程。

 

(3)方法三:使用Callable和Future创建线程(从Java 5 开始)

步骤:

(i)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,且该call()方法有返回值,再创建Callable实现类的实例。(PS:Java8开始,可以用Lambda表达式创建Callable对象)

(ii)使用FutureTask类来包装Callable对象,该Future对象封装了该Callable对象的call()方法的返回值。

(iii)使用FutureTask对象作为Thread对象的target创建并启动新线程。

(iv)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

 

(4)创建线程的三种方法的对比

继承Thread类:编写简单,可直接操作线程,适用于单继承。

实现Runnable接口:避免单继承局限性,便于共享资源。

 

【生命周期】

新建:当程序使用new关键字创建了一个线程之后。

就绪:当线程对象调用了start()方法之后。

死亡状态:线程结束。有三种情况:

(1)run()或call()方法执行结束,结束后就出于死亡状态。

(2)线程抛出一个未捕获的Exception或Error。

(3)直接调用该线程的stop()方法来结束该线程--该方法容易导致死锁,不推荐使用。

 

【控制线程】

1.join线程

join()方法--让一个线程等待另一个线程完成的方法。

 

2.后台线程

有一种线程,它是在后台运行的,它的任务是为其他的线程提供服务。又称为“守护线程”或“精灵线程”。如:JVM的垃圾回收线程。

 

3.线程睡眠--sleep

让当前正在执行的线程暂停一段时间,并进入阻塞状态。

方法:

(1)static void sleep(long millis)

(2)static void sleep(long millis,int nanos)

 

4.线程让步--yield()

让当前正在执行的线程暂停,并进入就绪状态。

 

5.改变线程的优先级。

setPriority()方法来设置优先级。

 

posted @ 2018-09-24 16:21  猩生柯北  阅读(149)  评论(0编辑  收藏  举报