面試:線程暫停的幾種方式

(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

相關文章
相關標籤/搜索