(1)概述:線程的掛起操做實質上就是使線程進入「非可執行」狀態下,在這個狀態下CPU不會分給線程時間片,進入這個狀態能夠用來暫停一個線程的運行。在線程掛起後,能夠經過從新喚醒線程來使之恢復運行。java
run() 和start() 是你們都很熟悉的兩個方法。把但願並行處理的代碼都放在run() 中;stat() 用於自動調用run(),這是Java的內在機制規定的。當一個線程進入「非可執行」狀態,必然存在某種緣由使其不能繼續運行,這些緣由多是以下幾種狀況:
A,經過調用sleep()方法使線程進入休眠狀態,線程在指定時間內不會運行。
B,經過調用join()方法使線程掛起,若是某個線程在另外一個線程t上調用t.join(),這個線程將被掛起,直到線程t執行完畢爲止。
C,經過調用wait()方法使線程掛起,直到線程獲得了notify()和notifyAll()消息,線程纔會進入「可執行」狀態。
(2)sleep()方法:是一個使線程暫時中止一段執行時間的方法,該時間由給定的毫秒數決定。下面演示一個使用sleep()方法的例子,以下。.net
class ThreadA extends Thread { public void run(){ System.out.println("ThreadA is running"); } } public class TestNew { public static void main(String[] args)throws InterruptedException { // TODO Auto-generated method stub ThreadA ta = new ThreadA(); ta.start(); ta.sleep(5000); System.out.println("TestNew is running"); } }
執行結果是:先ThreadA is running,5秒後,TestNew is running。有人會提出疑問:ta.sleep(5000);這個語句是ta線程睡眠了5秒,爲何執行結果是main這個主線程也睡眠了5秒?二者 是兩個獨立的線程纔對?緣由是:在哪一個線程裏聲明sleep,哪一個線程睡眠,因此是主線程睡眠了5000毫秒=5秒。線程
(3)join()方法:可以使當前執行的線程停下來等待,直至join()方法所調用的那個線程結束,再恢復執行。例如若是有一個線程A正在運行,用戶但願插入一個線程B,而且要求線程B執行完畢,而後再繼續線程A,此時能夠使用join()方法來完成這個需求。code
public class TestNew extends Thread { public static int a = 0; public void run(){ for(int k = 0;k < 5;k ++){ a = a + 1; } } public static void main(String[] args)throws InterruptedException { // TODO Auto-generated method stub TestNew ta = new TestNew(); ta.start(); ta.join(); System.out.println(String.valueOf(a)); } }
執行結果:5。ta線程執行完畢後,纔會開始打印a。若是沒有join(),則結果不必定是5,緣由是ta線程跟main線程的執行順序並不固定。對象
(4)wait()與notify()方法:wait()方法一樣能夠使線程進行掛起操做,調用了wait()方法的線程進入了「非可執行」狀態,使用wait()方法有兩種方式,例如:
thread.wait(1000);
或:
thread.wait();
thread.notify();
其中第一種方式給定線程掛起時間,基本上與sleep()方法用法相同。第二種方式是wait()與notify()方法配合使用,這種方式讓wait()方法無限等下去,直到線程接收到notify()或notifyAll()消息爲止。
wait()、notify()、notifyAll()不一樣於其餘線程方法,這3個方法是java.lang.Object類的一部分,因此在定義本身 類時會繼承下來。wait()、notify()、notifyAll()都被聲明爲final類,因此沒法從新定義。繼承
(5)suspend()與resume()方法
有時更好地掛起方法是強制掛起線程,而不是爲線程指定休眠時間,這種狀況下由其餘線程負責喚醒其繼續執行,除了wait()與notify()方法以外, 線程中還有一對方法用於完成此功能,這就是suspend()與resume()方法。 thread.suspend();thread.resume(),線程thread在運行到suspend()以後被強制掛起,暫停運行,直到主線程 調用thread.resume()方法時才被從新喚醒。
Java2中已經廢棄了suspend()和resume()方法,由於使用這兩個方法可能會產生死鎖,因此應該使用同步對象調用wait()和notify()的機制來代替suspend()和resume()進行線程控制。get