1. 程式人生 > >多執行緒中的join(),yield()與優先順序Priority

多執行緒中的join(),yield()與優先順序Priority

1、join():join()方法使呼叫該方法的執行緒在此之前執行完畢,也就是等待該方法的執行緒執行完畢後再往下繼續執行。注意該方法也需要捕捉異常。

ublic class Test {
	public static void main(String[] args) {
		MyThread2 m2 = new MyThread2("asda");
		m2.start();
		try {
			//join():讓這個先執行完成,其它執行緒的資源全部給這個執行緒
			m2.join();
		} catch (InterruptedException e) {
		}
		for (int i = 0; i <= 5; i++) {
			System.out.println("i am main thread");
		}
	}
}
class MyThread2 extends Thread {
	MyThread2(String s) {
		super(s);
	}
	@Override
	public void run() {
		for (int i = 0; i <= 10; i++) {
			System.out.println("i am " + getName());
		}
		try {
			sleep(1000);
		} catch (InterruptedException e) {
			return;
		}
	}
}
2、yield():該方法與sleep()類似,只是不能由使用者指定暫停多長時間,並且yield()方法只能讓同優先順序的執行緒有執行的機會。

sleep 方法使當前執行中的執行緒睡眠一段時間,進入不可以執行狀態,這段時間的長短是由程式設定的,yield方法使當前執行緒讓出CPU佔有權,但讓出的時間是不可設定的。

yield()也不會釋放鎖標誌。

實際上,yield()方法對應瞭如下操作;先檢測當前是否有相同優先順序的執行緒處於同可執行狀態,如有,則把CPU的佔有權交給次執行緒,否則繼續執行原來的執行緒,所以yield()方法稱為“退讓”,它把執行機會讓給了同等級的其他執行緒。

sleep 方法允許較低優先順序的執行緒獲得執行機會,但yield()方法執行時,當前執行緒仍處在可執行狀態,所以不可能讓出較低優先順序的執行緒此時獲取CPU佔有權。在一個執行系統中,如果較高優先順序的執行緒沒有呼叫sleep方法,也沒有受到I/O阻塞,那麼較低優先順序執行緒只能等待所有較高優先順序的執行緒執行結束,方可有機會執行。

yield()只是使當前執行緒重新回到可執行狀態,所有執行yield()的執行緒有可能在進入到可執行狀態後馬上又被執行,所以yield()方法只能使同優先順序的執行緒有執行的機會。


public class Test {
	public static void main(String[] args) {

		MyThread2 m1 = new MyThread2("a");
		MyThread2 m2 = new MyThread2("b");
		m1.start();
		m2.start();
	}
}

class MyThread2 extends Thread {
	MyThread2(String s) {
		super(s);
	}

	@Override
	public void run() {
		for (int i = 0; i <= 100; i++) {
			System.out.println(getName() + ":" + i);
			if (i % 10 == 0)
				//yield會讓出當前執行緒的資源,但是隻對於同一優先順序有效,對於比它優先順序低的,會無效
				yield();
		}

	}
}

3、優先順序Priority:
public class Test {
	public static void main(String[] args) {
		
		Thread t1 = new Thread(new T1());
		Thread t2 = new Thread(new T2());
		//Thread執行緒優先順序為1-10,預設值:NORM_PRIORITY為5,優先順序越高,越優先執行執行緒。
		t1.setPriority(Thread.NORM_PRIORITY+3);
		t1.start();
		t2.start();
	}
}

class T1 implements Runnable{
	@Override
	public void run() {
		for(int i=0;i<=1000;i++){
			System.out.println("T1:" + i);
		}
	}
}

class T2 implements Runnable{
	@Override
	public void run() {
		for(int i=0;i<=1000;i++){
			System.out.println("--------T2:" + i);
		}
	}
}