1. 程式人生 > >執行緒的常用方法介紹

執行緒的常用方法介紹

start()與run()

      start() 啟動執行緒並執行相應的run()方法
      run() 子執行緒要執行的程式碼放入run()方法

我們會發現,呼叫start()方法才是 啟動一個新的執行緒。呼叫run()方法只是主執行緒呼叫了一個類的一個普通方法。

getName()和setName()

 getName() 獲取此執行緒的名字
 setName() 設定此執行緒的名字

join()和yield()


yield() 暫停當前方法,釋放自己擁有的CPU,執行緒進入就緒狀態。它能讓當前執行緒由“執行狀態”進入到“就緒狀態”,從而讓其它具有相同優先順序的等待執行緒獲取執行權;但是,並不能保證在當前執行緒呼叫yield()之後,其它具有相同優先順序的執行緒就一定能獲得執行權;也有可能是當前執行緒又進入到“執行狀態”繼續執行!

class My_Thread extends Thread{
	public synchronized void run() {
		for(int i = 0;i < 10;i++) {
			System.out.println(Thread.currentThread().getName()+" --進行-- "+i);
			if(i == 4) {
				Thread.currentThread().yield();
			}
		}
	}
}
public class Test4 {
	public static void main(String[] args) {
		My_Thread my_Thread = new My_Thread();
		my_Thread.setName("t1");
		My_Thread my_Thread1 = new My_Thread();
		my_Thread1.setName("t2");
		
		my_Thread.start();
		my_Thread1.start();
	}
}

yield方法也不會釋放同步鎖

class My_Thread extends Thread{
	 private static Object obj = new Object();
	public  void run() {
		synchronized (obj) {
			for(int i = 0;i < 10;i++) {
				System.out.println(Thread.currentThread().getName()+" --進行-- "+i);
				if(i == 4) {
					Thread.currentThread().yield();
				}
			}
		}
		
	}
}
public class Test4 {
	public static void main(String[] args) {
		My_Thread my_Thread = new My_Thread();
		my_Thread.setName("t1");
		My_Thread my_Thread1 = new My_Thread();
		my_Thread1.setName("t2");
		
		my_Thread.start();
		my_Thread1.start();
	}
}

從執行結果我們可以清楚的看到yield()方法並不會釋放同步鎖。

join() 加入執行緒(當前執行的執行緒是A執行緒,呼叫join()方法得是B執行緒)  當前執行緒阻塞 執行B執行緒  B執行結束之後A執行緒才能執行
        放棄當前執行緒的執行 

class My_Thread extends Thread{
	public  void run() {
		for(int i = 0;i < 10;i++) {
			System.out.println(Thread.currentThread().getName()+" --進行-- "+i);
				
		}
	}
}
public class Test4 {
	public static void main(String[] args) {
		My_Thread my_Thread = new My_Thread();
		my_Thread.setName("t1");
		
		my_Thread.start();
		for(int i = 0;i < 10;i++) {
			/**
			 * 在i等於1時,將t1執行緒加入,等待t1執行緒執行完,main執行緒才會繼續執行
			 */
			if(i == 1) {
				try {
					my_Thread.join();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println(Thread.currentThread().getName()+" --進行-- "+i);
		}	
	}
}

interrupt()

interrupt() 中斷執行緒  由執行狀態到死亡狀態
     *         中斷執行緒操作實質上是修改了一下中斷標示位為true
     *         當前執行緒正在執行,僅僅修改標示位,不在做其他的事
     *         當前執行緒正在阻塞,修改標識位,如果是join,sleep,yield,則會丟擲Interrup異常,修改標示位為false

setDaemon()

setDaemon(true) 設定當前執行緒為守護執行緒
     * 守護執行緒和使用者執行緒最主要區別是守護執行緒脫離終端
     * 當用戶 執行緒不在,只存在守護執行緒 JVM就不在了,JVM不在了之後守護執行緒也就不在了

getPriority()

getPriority() 獲取執行緒優先順序    1~10   預設值為5    優先順序越高被優先呼叫的頻率越高