多線程中的join、sleep、yield方法

在多線程的學習過程中,join,sleep,yield方法屬於比較重要的方法,下面簡單介紹一下這三個方法

  • join() 等待該線程終止。
  • sleep(long millis) 休眠 以毫秒值爲單位。
  • yield() 線程的讓步 :暫停當前正在執行的線程對象,執行其它線程。

join()

當有線程調用join方法時,只能等待該方法終止以後,其他線程纔可以執行。當線程開啓以後,調用該方法,相當於方法調用,即線程對象.run()

代碼如下

public class Test {
	public static void main(String[] args) throws InterruptedException {
		// 創建線程對象
		A a = new A();
		a.start();//開啓線程
		a.join();//調用join方法
		for (int i = 0; i < 100; i++) {
			System.out.println(i);
		}
	}

}

class A extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println("=========" + i);
		}
	}
}

運行結果
沒有使用join()方法的運行結果
在這裏插入圖片描述
使用join()方法以後運行結果
在這裏插入圖片描述
通過運行代碼可知,只有當A類中代碼執行完畢以後,main方法中的循環纔會執行

sleep(long millis)

sleep(long millis) 休眠 以毫秒值爲單位。這個沒啥說的,也好理解,就是調用該方法的時候,程序會暫停,暫停時間是minllis毫秒

代碼實現

public class Test {
	public static void main(String[] args) throws InterruptedException {
		// 創建線程對象
		A a = new A();
		a.start();//開啓線程
		Thread.sleep(1000);//程序運行到這裏會暫停1秒
		for (int i = 0; i < 100; i++) {
			System.out.println(i);
		}
	}

}

class A extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println("=========" + i);
		}
	}
}

注:1s=1000ms

yield()

yield()應該做的是讓當前運行線程回到就緒狀態,以允許具有相同優先級的其他線程獲得運行機會。因此,使用yield()的目的是讓相同優先級的線程之間能適當的輪轉執行。但是,實際中無法保證yield()達到讓步目的,因爲讓步的線程還有可能被線程調度程序再次選中。在大多數情況下,yield()將導致線程從運行狀態轉到可運行狀態,但有可能沒有效果。在我的調用過程中就沒有太大的效果。

  • 針對兩種線程創建方法的不同調用
  • 方式一
public class Test {
	public static void main(String[] args) throws InterruptedException {
		// 創建線程對象
		A a = new A();
		a.start();
		for (int i = 0; i < 1000; i++) {
			System.out.println(i);
		}
	}
}

class A extends Thread{
	@Override
	public void run() {
		for (int i = 0; i < 1000; i++) {
			if(i%10==0) {
				yield();
			}
			System.out.println(i+"=========");
		}
	}
}

  • 方式二
public class Test {
	public static void main(String[] args) throws Exception {
		B b = new B();
		Thread t = new Thread(b);
		t.start();
		for (int i = 1; i < 1000; i++) {
			System.out.println("~~~~~~~"+i);
		}	
	}
}
class B implements Runnable{
	@Override
	public void run() {
		for (int i = 1; i <= 1000; i++) {
		System.out.println("++++++"+i);
			if(i%10==0) {
				Thread.yield();
//				Thread.currentThread().yield();//yield是靜態方法,使用類名.方法名()的方式調用
			}		
		}
	}	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章