1. 程式人生 > >java多執行緒——執行緒中的常用操作方法

java多執行緒——執行緒中的常用操作方法

線上程中所有的方法都是在Thread類中。

執行緒操作的主要方法如下:

public Thread(Runnable   target )Thread物件接受一個實現了Runnable介面的物件,並例項化這個Thread執行緒!

public Thread(Runnable   target ,String name ) Thread物件接受一個實現了Runnable介面的物件,並例項化這個Thread執行緒,並且為這個執行緒命名!

public  Thread(String name )例項化這個執行緒,併為這個執行緒物件命名!

public static   Thread  

public  final  String getName()得到執行緒的名字!

public  final int 

public  boolean  

public final boolean  isAlive()判斷執行緒是否在活動!

public final  void join() throws  InterruptedException等待執行緒死亡!

public final void join(long  millis) throws  InterruptedException   等待執行緒死亡的最大時間為millis毫秒!

public void run()執行執行緒

public final  void setName(String name)  設定執行緒的名稱!!

public  final  void set(int  priority)設定執行緒的優先順序!

public final void sleep(long  millis)throws  InterruptedException  使當前正在執行的執行緒休眠多少毫秒!

public static void yeild()暫停當前物件並使其他執行緒執行!

public final void  setDaemon(boolean  on) 將當前執行緒標記為後臺執行執行緒!

下面通過例子程式來對上邊一些方法加以說明:

1設定執行緒的名字!

首先我們可以通過Thread類中的setName和getName 這兩個方法來設定執行緒的名字和得到執行緒的名字!當然我們還可以為兩個不同的執行緒設定相同的名字,但是為了能夠清晰的區分,強烈建議不要這樣做!如果執行緒沒有設定名字的話,系統會自動的為執行緒分配一個名稱!一般為了方便起見,我們線上程啟動之前就把給執行緒取好名字,因為在中途取名的話一定會很麻煩的!

程式碼如下:

package com.pzhu.www.thread;

public class ThreadTest01 {

	public static void main(String[] args) {

		Thread01 a = new Thread01();
		a.setName("gongyansong");
		String name = a.getName();
		Thread01 b = new Thread01();
		b.setName("gongyansong");
		String name1 = b.getName();
		System.out.println("a執行緒的名字為:  "+name);
		System.out.println("b執行緒的名字為:  "+name1);
		a.start();

	}
}

下面講一下這個怎樣取得當前執行緒!

下面這個得到當前執行緒名的程式碼:

這裡要注意的是得到執行緒的方法時currentThread() ,這個方法是個靜態方法直接通過類名呼叫即可!

package com.pzhu.www.thread;

public class CurrentThread extends Thread {

	public void run(){
		
		for(int i=0;i<5;i++){
			System.out.println("當前執行緒名為:"+Thread.currentThread().getName());
		}
	}
}
測試程式碼如下:
package com.pzhu.www.thread;

public class ThreadTest02 {

	public static void main(String[] args){
		
		CurrentThread ct = new CurrentThread();
		ct.setName("gongyuansong");
		ct.start();
		ct.run();
	}
}



結果如圖所示:


結果我們會發現這其中會出現名字叫main 這個執行緒!這到底是為什呢?

首先在執行start方法時執行的是gongyuansong這個執行緒,而在執行ct.run這個方法時我們是通過main方法呼叫的,所以會得到這樣的結果!這裡就可以看出java中的main方法其實也是一個執行緒。同樣在啟動JVM的時候作業系統為程式啟動了一個JVM的程序!同時JVM具備gc機制,其實gc機制也是一個執行緒,所以我們執行一個java程式的時候至少啟動了兩個執行緒,主執行緒,和gc執行緒!

2判斷執行緒是否啟動!

package com.pzhu.www.thread;

public class ThreadTest02 {

	public static void main(String[] args){
		
		CurrentThread ct = new CurrentThread();
	
		System.out.println("start前,執行緒是否啟動:"+ct.isAlive());
		ct.start();
		System.out.println("start後,執行緒是否啟動:"+ct.isAlive());
		
		for(int i=0;i<5;i++){
			System.out.println("當前正在執行的執行緒:   "+Thread.currentThread().getName());
		}
		
		System.out.println("start後,執行緒是否啟動:"+ct.isAlive());
		//上面這行程式碼的值是不確定的,因為不知道是主執行緒先執行完還是ct這個執行緒先執行完!
		
	}
}

結果如下:


3執行緒的強制執行!

執行緒強制執行使用的方法是join()這個方法!

線上程強制執行期間,其他的執行緒不能執行,只有等到這個強制執行的執行緒執行完了其他的執行緒才能使用!

package com.pzhu.www.thread;

public class JoinThreadTest {

	public static void main(String[] args) {

		JoinThread  jt01 = new JoinThread();
		jt01.setName("jt01");
	
		for(int i=0;i<10;i++) {
			
			System.out.println("main執行緒執行中....");
			if(i==5){
//				判斷如果i的值為5的話我們就啟動jt01這個執行緒,並且打斷當前執行緒強制執行!
//				這個的join是要丟擲異常的所以必須try起來
				try {
					jt01.start();
					jt01.join();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

		
	}

}
4執行緒的休眠

執行緒的休眠是通過sleep這個方法實現的,這個方法是一個static方法,所以我們可以直接使用Thread.sleep()來呼叫,同樣也可以使用執行緒類的物件來呼叫,但是不建議這樣使用!這個方法很簡單,所以不再貼程式碼!

5後臺執行緒就是在後臺執行的現場,java中通過setDaemon()方法來將一個執行緒設定為後臺執行緒!如果寫了一個死迴圈的執行緒的話,前臺執行緒是一直會執行的,而後臺執行緒不會一直執行,後臺執行緒會在前臺所有的執行緒結束之後也隨之結束的!所以後臺執行緒不會一直執行的!

下面通過程式碼來說明:

執行緒程式碼:

package com.pzhu.www.backgroundthread;

public class BackGroundThread01 extends Thread {

	public void run() {
		int i = 0;
		while (true) {
			System.out.println("執行緒" + Thread.currentThread().getName()
					+ "執行中......." + i++);
		}
	}

}
測試程式碼:
package com.pzhu.www.backgroundthread;

public class BackGroundThreadTest01 {

	public static void main(String[] args) {

		BackGroundThread01 bg = new BackGroundThread01();
		bg.setName("BGThread");
		bg.setDaemon(true);
		bg.start();
		
		
	}

}
而出現的結果每次都不會一樣,這裡不多說!

6執行緒的優先順序

在java的執行緒執行過程當中,執行緒在執行之前執行緒都會保持就緒狀態,但是優先順序高的執行緒就有可能被先執行!

設定執行緒的優先順序是通過setPriority這個方法的,同時還可以通過Thread.currentThread().getPriority()這個方法得到當前執行緒的優先順序!

下面通過程式碼說明:

執行緒類如下:

package com.pzhu.www.priority;

public class Thread01 extends Thread {

	public void run(){
		
		for(int i=0;i<5;i++){
			
			System.out.println("當前執行緒名:"+Thread.currentThread().getName()+" 當前執行緒的優先順序:"+Thread.currentThread().getPriority()+"     "+i);
		
		}
	}
	
}


測試類:
package com.pzhu.www.priority;

public class ThreadTest01 {


	public static void main(String[] args) {

		Thread01 t1 = new Thread01();
		Thread01 t2 = new Thread01();
		Thread01 t3 = new Thread01();
		t1.setName("t1");
		t2.setName("t2");
		t3.setName("t3");
		t1.setPriority(Thread.MIN_PRIORITY);
		t2.setPriority(Thread.NORM_PRIORITY);
		t3.setPriority(Thread.MAX_PRIORITY);
		t1.start();
		t2.start();
		t3.start();
		
		
	}

}

最後我們會發現結果是不確定的,好像並沒有實現優先順序。但是實際上優先順序只是會增加優先執行的機率,並不能完全實現優先順序的控制,還有就是這幾個執行緒本來就是併發執行的,所以這裡面還有併發的因數在裡面!執行緒裡面優先順序是通過1到10的int型的數表示的,數字越大優先順序越高,同時java提供三個常量來表示三個優先級別,常量分別是:

MIN_PRIORITY   最低優先順序

NORM_PRIORITY中等優先順序

MAX_PRIORITY最高優先順序

7執行緒的禮讓

java中可以通過yield()方法來實現執行緒的禮讓,即將現在正在執行的執行緒暫定,讓其他的執行緒執行。下面通過程式碼說明:

執行緒類

package com.pzhu.www.yield;

public class Thread01 implements Runnable {

	@SuppressWarnings("static-access")
	public void run() {

		for(int i=0;i<10;i++){
			if(i>=3) {
				Thread.currentThread().yield();
				
			}
			System.out.println(Thread.currentThread().getName()+"執行緒執行中.....");
		}
	}

}

測試程式碼如下:

package com.pzhu.www.yield;

public class ThreadTest01 {

	public static void main(String[] args) {

		Thread01 t = new Thread01();
		Thread thread01 = new Thread(t);
		Thread thread02 = new Thread(t);
		Thread thread03 = new Thread(t);
		thread01.start();
		thread02.start();
		thread03.start();
		
		
	}

}

結果就不貼出了!自己參透!!




總結:
以上的方法都是Thread類中的方法,這裡只簡單的介紹,有不懂的自己去檢視文件!





歡迎評論!