1. 程式人生 > >多執行緒中yield()和join()方法的對比

多執行緒中yield()和join()方法的對比

1.yield():呼叫此方法的執行緒,釋放當前cpu的執行權

class SubTread extends Thread{
	@Override
	public void run() {
		for(int i=1;i<=100;i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}	
}
public class TestThread {
	public static void main(String[] args) {
		SubTread st1 = new SubTread();
		st1.setName("子執行緒1");
		st1.start();
		Thread.currentThread().setName("==========主執行緒");
		for(int i=1;i<=100;i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
			if(i % 10 ==0){
				Thread.currentThread().yield();
			}
		}
	}
}

結果:

==========主執行緒:1
子執行緒1:1
==========主執行緒:2
子執行緒1:2
==========主執行緒:3
子執行緒1:3
子執行緒1:4
子執行緒1:5
子執行緒1:6
子執行緒1:7
子執行緒1:8
子執行緒1:9
子執行緒1:10
子執行緒1:11
==========主執行緒:4
子執行緒1:12
子執行緒1:13
子執行緒1:14
==========主執行緒:5
子執行緒1:15
==========主執行緒:6
子執行緒1:16
==========主執行緒:7
子執行緒1:17
==========主執行緒:8
子執行緒1:18
子執行緒1:19
==========主執行緒:9
子執行緒1:20
==========主執行緒:10
子執行緒1:21
子執行緒1:22
==========主執行緒:11
子執行緒1:23
==========主執行緒:12
子執行緒1:24
==========主執行緒:13
子執行緒1:25
子執行緒1:26
==========主執行緒:14
子執行緒1:27
==========主執行緒:15
子執行緒1:28
==========主執行緒:16
子執行緒1:29
==========主執行緒:17
子執行緒1:30
==========主執行緒:18
子執行緒1:31
==========主執行緒:19
子執行緒1:32
==========主執行緒:20
子執行緒1:33
==========主執行緒:21
子執行緒1:34
==========主執行緒:22
子執行緒1:35
==========主執行緒:23
子執行緒1:36
==========主執行緒:24
子執行緒1:37
==========主執行緒:25
子執行緒1:38
子執行緒1:39
子執行緒1:40
==========主執行緒:26
==========主執行緒:27
==========主執行緒:28
==========主執行緒:29
==========主執行緒:30
==========主執行緒:31
==========主執行緒:32
==========主執行緒:33
子執行緒1:41
子執行緒1:42
子執行緒1:43
子執行緒1:44
子執行緒1:45
子執行緒1:46
子執行緒1:47
子執行緒1:48
子執行緒1:49
子執行緒1:50
==========主執行緒:34
子執行緒1:51
==========主執行緒:35
子執行緒1:52
==========主執行緒:36
子執行緒1:53
==========主執行緒:37
子執行緒1:54
==========主執行緒:38
子執行緒1:55
子執行緒1:56
子執行緒1:57
子執行緒1:58
子執行緒1:59
子執行緒1:60
子執行緒1:61
子執行緒1:62
子執行緒1:63
子執行緒1:64
子執行緒1:65
==========主執行緒:39
子執行緒1:66
==========主執行緒:40
子執行緒1:67
==========主執行緒:41
子執行緒1:68
==========主執行緒:42
子執行緒1:69
==========主執行緒:43
子執行緒1:70
==========主執行緒:44
==========主執行緒:45
==========主執行緒:46
子執行緒1:71
==========主執行緒:47
子執行緒1:72
==========主執行緒:48
子執行緒1:73
==========主執行緒:49
子執行緒1:74
子執行緒1:75
子執行緒1:76
==========主執行緒:50
子執行緒1:77
==========主執行緒:51
子執行緒1:78
==========主執行緒:52
子執行緒1:79
==========主執行緒:53
子執行緒1:80
==========主執行緒:54
子執行緒1:81
==========主執行緒:55
子執行緒1:82
==========主執行緒:56
子執行緒1:83
==========主執行緒:57
子執行緒1:84
==========主執行緒:58
子執行緒1:85
==========主執行緒:59
==========主執行緒:60
子執行緒1:86
==========主執行緒:61
子執行緒1:87
==========主執行緒:62
子執行緒1:88
子執行緒1:89
子執行緒1:90
子執行緒1:91
子執行緒1:92
子執行緒1:93
子執行緒1:94
子執行緒1:95
子執行緒1:96
==========主執行緒:63
子執行緒1:97
==========主執行緒:64
子執行緒1:98
==========主執行緒:65
子執行緒1:99
==========主執行緒:66
子執行緒1:100
==========主執行緒:67
==========主執行緒:68
==========主執行緒:69
==========主執行緒:70
==========主執行緒:71
==========主執行緒:72
==========主執行緒:73
==========主執行緒:74
==========主執行緒:75
==========主執行緒:76
==========主執行緒:77
==========主執行緒:78
==========主執行緒:79
==========主執行緒:80
==========主執行緒:81
==========主執行緒:82
==========主執行緒:83
==========主執行緒:84
==========主執行緒:85
==========主執行緒:86
==========主執行緒:87
==========主執行緒:88
==========主執行緒:89
==========主執行緒:90
==========主執行緒:91
==========主執行緒:92
==========主執行緒:93
==========主執行緒:94
==========主執行緒:95
==========主執行緒:96
==========主執行緒:97
==========主執行緒:98
==========主執行緒:99
==========主執行緒:100

子執行緒列印從1-100的數字,主執行緒也列印1-100的資料

在主執行緒執行過程中當列印的數字為整數時呼叫yield()方法,讓出cpu的執行權,這時主執行緒和子執行緒str1都可以爭奪cpu的執行權,即我們在結果中可以看到有主執行緒列印整數後,子執行緒列印的情況;也有主執行緒列印整數後,主執行緒繼續列印的情況。

join():在A執行緒中呼叫B執行緒的join()方法,表示當執行到此方法,A執行緒停止執行,直至B執行緒執行完畢,A執行緒再接著join()之後的程式碼執行

class SubTread extends Thread{

	//2.重寫Thread裡的run方法,方法內實現此子執行緒要完成的功能
	@Override
	public void run() {
		for(int i=1;i<=100;i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}

public class TestThread1 {
	public static void main(String[] args) {
		SubTread st1 = new SubTread();
		st1.setName("子執行緒1");
		st1.start();
		Thread.currentThread().setName("==========主執行緒");
		for(int i=1;i<=100;i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
			if(i == 20){
				try {
					st1.join();
				} catch (InterruptedException e) {
					// TODO 自動生成的 catch 塊
					e.printStackTrace();
				}
			}
		}
	}
}

結果:

==========主執行緒:1
==========主執行緒:2
==========主執行緒:3
子執行緒1:1
子執行緒1:2
子執行緒1:3
==========主執行緒:4
子執行緒1:4
==========主執行緒:5
子執行緒1:5
子執行緒1:6
==========主執行緒:6
子執行緒1:7
==========主執行緒:7
子執行緒1:8
==========主執行緒:8
==========主執行緒:9
==========主執行緒:10
子執行緒1:9
==========主執行緒:11
子執行緒1:10
子執行緒1:11
子執行緒1:12
子執行緒1:13
子執行緒1:14
子執行緒1:15
子執行緒1:16
子執行緒1:17
子執行緒1:18
子執行緒1:19
子執行緒1:20
子執行緒1:21
子執行緒1:22
子執行緒1:23
子執行緒1:24
子執行緒1:25
子執行緒1:26
子執行緒1:27
子執行緒1:28
子執行緒1:29
子執行緒1:30
子執行緒1:31
子執行緒1:32
子執行緒1:33
子執行緒1:34
子執行緒1:35
==========主執行緒:12
==========主執行緒:13
==========主執行緒:14
==========主執行緒:15
==========主執行緒:16
==========主執行緒:17
==========主執行緒:18
==========主執行緒:19
==========主執行緒:20
子執行緒1:36
子執行緒1:37
子執行緒1:38
子執行緒1:39
子執行緒1:40
子執行緒1:41
子執行緒1:42
子執行緒1:43
子執行緒1:44
子執行緒1:45
子執行緒1:46
子執行緒1:47
子執行緒1:48
子執行緒1:49
子執行緒1:50
子執行緒1:51
子執行緒1:52
子執行緒1:53
子執行緒1:54
子執行緒1:55
子執行緒1:56
子執行緒1:57
子執行緒1:58
子執行緒1:59
子執行緒1:60
子執行緒1:61
子執行緒1:62
子執行緒1:63
子執行緒1:64
子執行緒1:65
子執行緒1:66
子執行緒1:67
子執行緒1:68
子執行緒1:69
子執行緒1:70
子執行緒1:71
子執行緒1:72
子執行緒1:73
子執行緒1:74
子執行緒1:75
子執行緒1:76
子執行緒1:77
子執行緒1:78
子執行緒1:79
子執行緒1:80
子執行緒1:81
子執行緒1:82
子執行緒1:83
子執行緒1:84
子執行緒1:85
子執行緒1:86
子執行緒1:87
子執行緒1:88
子執行緒1:89
子執行緒1:90
子執行緒1:91
子執行緒1:92
子執行緒1:93
子執行緒1:94
子執行緒1:95
子執行緒1:96
子執行緒1:97
子執行緒1:98
子執行緒1:99
子執行緒1:100
==========主執行緒:21
==========主執行緒:22
==========主執行緒:23
==========主執行緒:24
==========主執行緒:25
==========主執行緒:26
==========主執行緒:27
==========主執行緒:28
==========主執行緒:29
==========主執行緒:30
==========主執行緒:31
==========主執行緒:32
==========主執行緒:33
==========主執行緒:34
==========主執行緒:35
==========主執行緒:36
==========主執行緒:37
==========主執行緒:38
==========主執行緒:39
==========主執行緒:40
==========主執行緒:41
==========主執行緒:42
==========主執行緒:43
==========主執行緒:44
==========主執行緒:45
==========主執行緒:46
==========主執行緒:47
==========主執行緒:48
==========主執行緒:49
==========主執行緒:50
==========主執行緒:51
==========主執行緒:52
==========主執行緒:53
==========主執行緒:54
==========主執行緒:55
==========主執行緒:56
==========主執行緒:57
==========主執行緒:58
==========主執行緒:59
==========主執行緒:60
==========主執行緒:61
==========主執行緒:62
==========主執行緒:63
==========主執行緒:64
==========主執行緒:65
==========主執行緒:66
==========主執行緒:67
==========主執行緒:68
==========主執行緒:69
==========主執行緒:70
==========主執行緒:71
==========主執行緒:72
==========主執行緒:73
==========主執行緒:74
==========主執行緒:75
==========主執行緒:76
==========主執行緒:77
==========主執行緒:78
==========主執行緒:79
==========主執行緒:80
==========主執行緒:81
==========主執行緒:82
==========主執行緒:83
==========主執行緒:84
==========主執行緒:85
==========主執行緒:86
==========主執行緒:87
==========主執行緒:88
==========主執行緒:89
==========主執行緒:90
==========主執行緒:91
==========主執行緒:92
==========主執行緒:93
==========主執行緒:94
==========主執行緒:95
==========主執行緒:96
==========主執行緒:97
==========主執行緒:98
==========主執行緒:99
==========主執行緒:100

在程式碼中設定當主執行緒列印20時呼叫子執行緒的join()方法,這時主執行緒會停止執行,等待子執行緒執行結束,主執行緒繼續執行。

相關推薦

執行yield()join()方法對比

1.yield():呼叫此方法的執行緒,釋放當前cpu的執行權class SubTread extends Thread{ @Override public void run() { for(int i=1;i<=100;i++){ System.out.

Java執行yieldjoin方法的區別

長期以來,多執行緒問題頗為受到面試官的青睞。雖然我個人認為我們當中很少有人能真正獲得機會開發複雜的多執行緒應用(在過去的七年中,我得到了一個機會),但是理解多執行緒對增加你的信心很有用。之前,我討論了一個wait()和sleep()方法區別的問題,這一次,我將會討

java執行yield()join()的區別

package test.core.threads; public class JoinExample { public static void main(String[] args) throws InterruptedException { Thread t = new Thr

Java執行休眠方法sleep、執行讓步yieldjoin方法

執行緒休眠(sleep方法) 執行緒休眠:讓執行緒暫緩執行,等到預計時間之後再恢復執行。 執行緒休眠會交出cpu,讓cpu去執行其他任務,但是不會釋放鎖。 比如:當前執行緒sleep休眠了,但是如果此執行緒在休眠前持有某個物件的鎖,那就算它休眠了其他執行緒也不能獲取到這個物件的鎖。

【原】對執行WaitJoin的理解

對於,wait方法的解釋,有時候覺得很矛盾。呼叫某個物件的wait時,需要獲得該物件的鎖,在執行的時候又需要釋放該物件的所有鎖。這是問題一。 另外,在看Join的原始碼,會發現它利用了Wait來實現,但是它的實現原理是怎樣的呢? 這是問題二。 看下原始碼的英文描述:

關於執行sleep、joinyield的區別

好了、說了多執行緒,那就不得不說說多執行緒的sleep()、join()和yield()三個方法的區別啦    1、sleep()方法 /** * Causes the currently executing thread to sleep (temporarily cease

執行《三》join方法

一 Process物件的join方法 在主程序執行過程中如果想併發地執行其他的任務,我們可以開啟子程序,此時主程序的任務與子程序的任務分兩種情況 情況一:在主程序的任務與子程序的任務彼此獨立的情況下,主程序的任務先執行完畢後,主程序還需要等待子程序執行完畢,然後統一回收資源。 情況二:如果主程序的任務在

執行佇列同/非同步執行問題

佇列分為並行佇列和序列佇列,執行方式分為同步執行和非同步執行,那麼組合一下就有四種方式,下面我會用GCD來驗證和總結一下各個組合的特性。 併發佇列,同步執行 //併發佇列+同步執行 //不會開啟新執行緒,任務順序執行 -(void)test1{ NSLog(@"併發佇列+

執行waitsleep區別

wiat和sleep的區別? 1、wait可以指定時間也可以不指定      sleep必須指定時間。 2、在同步中,對cpu的執行權和鎖的處理不同 wait:釋 放執行權,釋放鎖。 slee

java執行學習(一): 執行start()run()的區別

趁著有空,看看執行緒Thread的原始碼,挺有意思的 這裡來說說多執行緒中start()和run()的區別。 1-跟start()有關的原始碼: public class Thread implements Runnable { private ThreadGroup group;

python執行daemon的屬性方法

我們看官方介紹是這樣的: 意思就是說:這個屬性為一個布林值,表示是否為一個守護程序,且這個屬性設定必須線上程的start方法開始之前呼叫。它的值繼承自主執行緒,主執行緒的daemon為False且所有從主執行緒建立的執行緒都是daemon = False 。 下面一句

Java執行start()run()的區別

Java的執行緒是通過java.lang.Thread類來實現的。VM啟動時會有一個由主方法所定義的執行緒。可以通過建立Thread的例項來建立新的執行緒。每個執行緒都是通過某個特定Thread物件所對應的方法run()來完成其操作的,方法run()稱為執行緒體。通過呼叫Thread類的start(

執行sleep()、wait()方法等得區別?

  1、這兩個方法來自不同的類分別是Thread和Object   2、最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。   3、wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sl

關於執行同步非同步的理解

執行緒同步:就是多個執行緒同時訪問同一資源,必須等一個執行緒訪問結束,才能訪問其它資源,比較浪費時間,效率低 執行緒非同步:訪問資源時在空閒等待時可以同時訪問其他資源,實現多執行緒機制 說起來比較抽象,我用程式碼嘗試了一下 //以非同步的方式提交佇列 -(

c#執行,原理常用方法

using System;using System.Text;using System.Threading;namespace 多執行緒 {     publicclass Example     {         publicstaticvoid Main()         {             

Java執行 synchronizedLock的區別

我們已經瞭解了Java多執行緒程式設計中常用的關鍵字synchronized,以及與之相關的物件鎖機制。這一節中,讓我們一起來認識JDK 5中新引入的併發框架中的鎖機制。 我想很多購買了《Java程式設計師面試寶典》之類圖書的朋友一定對下面這個面試題感到非常熟悉: 問:請對比synchronized與java

執行InvokeRequiredInvoke的用法,講的很清楚

C#中禁止跨執行緒直接訪問控制元件,InvokeRequired是為了解決這個問題而產生的,當一個控制元件的InvokeRequired屬性值為真時,說明有一個建立它以外的執行緒想訪問它。此時它將會在內部呼叫new MethodInvoker(LoadGlobalImag

關於執行的start()run()方法

           剛剛接觸多執行緒,對多執行緒還感覺很陌生,按照以前的寫法都習慣了直接呼叫方法,如class Demo extends Thread //建立執行緒的第一種方法,直接繼承Thread類 { public void run(){ for(int

執行joindetach方法的理解

thread.Join把指定的執行緒加入到當前執行緒,可以將兩個交替執行的執行緒合併為順序執行的執行緒。比如線上程B中呼叫了執行緒A的Join()方法,直到執行緒A執行完畢後,才會繼續執行執行緒B。 join是阻塞當前執行緒,並等待object對應執行緒結束,

執行sleep,yield,wait,join區別聯絡

/** * 總結: * 1.sleep():誰呼叫,誰睡眠,不會釋放物件鎖,執行緒可以同步的,可以使用interrupt()強制中斷睡眠 * 2.sleep():是Thread類的靜態方法,需要捕獲異常  * 3.join() 內部呼叫了 wait(),會出讓鎖,而 slee