1. 程式人生 > >執行緒優先順序練習記錄

執行緒優先順序練習記錄

package cm;

public class test20180502Concurrency extends Thread {
	private int countdown = 5;
	private static int threadcount = 0;

	public test20180502Concurrency(int newPriority) {
		super("" + ++threadcount);//接受一個static引數,設定執行緒名稱
		setPriority(newPriority);
		start();//start方法執行必要的執行緒初始化,並呼叫run方法
	}

	public String toString() {
		return "#" + getName() + ":" + countdown;//getname是Thread中的一個靜態方法。
	}

	public void run() {
//		while(true) {
//			System.out.println(this);
//			if(--countdown==0) {
//				return;//跳出迴圈
//			}
//			yield();//給執行緒排程機制一個暗示,表示可以將cpu分配給其他執行緒了,但不一定保證被程式排程器採納。
//			try {
//				sleep(100);//使得執行緒睡眠100毫秒。
//			} catch (InterruptedException e) {//丟擲異常的原因是:當對此執行緒具有引用,並在這個引用上呼叫了interrupt()方法,那麼就會丟擲InterruptedException異常。
//				e.printStackTrace();
//			}
//		}
		
		
		//修改上面程式版本,為程式新增優先權。使得處於等待狀態的高優先順序執行緒先得到執行。
		while(true) {
			System.out.println(this);
			if(--countdown==0) {
				return;//跳出迴圈
			}
		}
		
		
	}

	public static void main(String[] args) {
		for(int i=0;i<5;i++) {
			//測試執行緒優先順序。
			if(i<4) {
				new test20180502Concurrency(Thread.MIN_PRIORITY);//最小優先順序
			}else {
				new test20180502Concurrency(Thread.MAX_PRIORITY);//最大優先順序
			}
			
			//new test20180502Concurrency();//建立五個執行緒。觀察他們的列印順序,同時執行的。
			//這裡並沒有宣告這個例項的引用,但是垃圾回收器不會回收這個物件,因為thread物件需要註冊自己,在某個地方
			//有著對這個threead物件的引用。只有執行緒 離開了run方法的時候才會將這個物件清理掉。
		}

	}
}