1. 程式人生 > >Java子執行緒和主執行緒交替輸出(一個簡單的例項)

Java子執行緒和主執行緒交替輸出(一個簡單的例項)

實現主執行緒和子執行緒的交替輸出列印,首先建立一個實現執行緒方法的Service

public class Service {
	private volatile boolean flag = false; //這是一個控制sub和mian的開關,加關鍵字volatile保證不同的執行緒看到的flag值是最新的
	public synchronized void sub(){
		while(flag) {  //因為flag初始值是false,所以當子執行緒獲取鎖進入時不會等待,會直接輸出列印
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		for(int i=0;i<5;i++) {
			System.out.println("子執行緒執行  "  +i);
		}
		flag = true;  //列印完成後,應當切換到main,同時應當喚醒正在等待的主執行緒
		this.notifyAll(); //子執行緒再次試圖進入sub時,flag為true,就會進入等待,切換到了main中
	}
	
	public synchronized void main() {
		while(!flag) {  //flag初始值是false,因此,即使主執行緒先獲取鎖也會進入等待狀態,並釋放鎖,一直到sub執行完後,flag變為true,同時,主執行緒被喚醒
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		//主執行緒被喚醒後,開始列印輸出
		
		for(int i=0;i<5;i++) {
			System.out.println("main執行緒執行  "  +i);
		}
		
		flag = false;  //然後又切換到sub,並喚醒等待的子執行緒
		this.notifyAll();
	}
}
sub方法是子執行緒呼叫的,main方法是主執行緒呼叫
public static void main(String[] args) throws InterruptedException {
		
	final Service service = new Service();
		
	Runnable r = new Runnable() {
			
		@Override
		public void run() {
			for(int i=0;i<5;i++) {
				service.sub();         //多次試圖執行子執行緒
			}
		}
	};
		
	Thread thread = new Thread(r);
	thread.start();
		
	for(int i=0;i<5;i++) {
		service.main();   //和子執行緒競爭鎖
	}
}

這樣,子執行緒啟動後,會和主執行緒同時競爭service的鎖,因為flag初始值是false,則即使主執行緒先獲取的鎖,也會進入等待,釋放鎖,所以,首先會列印子執行緒的輸出,子執行緒列印完成後,flag變為true,並且喚醒的其他的執行緒(因為一共就兩個執行緒,所以,另一個等待的執行緒就是主執行緒)。然後又回到了原始的狀態,只是這次flag是true,因此,主執行緒會獲取到鎖,並列印輸出,這樣依次會交替5次。

相關推薦

Java執行執行交替輸出一個簡單例項

實現主執行緒和子執行緒的交替輸出列印,首先建立一個實現執行緒方法的Service public class Service { private volatile boolean flag = false; //這是一個控制sub和mian的開關,加關鍵字volatil

Qt中通過訊號槽在執行執行中進行資料傳遞

QT中兩個執行緒之間進行自定義型別資料傳遞 兩個執行緒中進行資料傳遞時,傳遞的資料放到佇列中(queue),所以在這個過程中,需要在傳遞前將資料拷貝、儲存到佇列中;為了儲存這些引數,Qt需要construct、destruct、copy這些物件,為了讓Qt知道

Java執行--讓執行等待執行執行完畢

參考連結:https://www.cnblogs.com/eoss/p/5902939.html 使用Java多執行緒程式設計時經常遇到主執行緒需要等待子執行緒執行完成以後才能繼續執行,那麼接下來介紹一種簡單的方式使主執行緒等待。 java.util.concurrent.CountDown

java執行執行傳遞資料回撥函式

預習知識點: 什麼是回撥函式? 下面是知乎大神的回答,簡直不能再精闢 程式碼: package kun.thread; public class THread { static C c=new C(); //flag用來標誌子執行緒執行結束 stati

Java執行其餘執行的區別實踐Main、Runnable、Thread

在日常的開發中,很多一些開發中較常見的問題,還是需要去仔細研究一下,最重要的還是實踐。以小見大。 一、Java執行緒中。Main、Runnable和Thread。 相信在工作中,只要是有用到多執行緒非同步程式設計,最起碼都要和這三個打交道。 1、每個Java應用程式

Handler訊息傳遞機制執行中傳遞new Handler執行中new Handle傳遞訊息

> 子執行緒中更新UI new Thread(new Runnable() {         @Override         public void run() {             Looper.prepare();          

JAVA執行等待所有執行執行完成後執行執行

         如標題,此功能主要是JDK1.5引入的java.util.concurrent包下的CountDownLatch類,此類據介紹為以執行緒輔助類,通過執行緒計數器來實現一個或多個主執行緒等待其下所有子執行緒執行完後主執行緒再繼續執行的功能。        

Java 執行執行等待執行awaitTermination方法使用詳解

    Java中在使用Executors執行緒池時,有時場景需要主執行緒等各子執行緒都執行完畢後再執行。這時候就需要用到ExecutorService介面中的awaitTermination方法,我們來看看原始碼中對該方法的說明:大概意思是這樣的:該方法呼叫會被阻塞,並且在

[Java][Android] 多執行同步-執行等待所有執行完成案例

有時候我們會遇到這樣的問題:做一個大的事情可以被分解為做一系列相似的小的事情,而小的事情無非就是引數上有可能不相同而已! 此時,如果不使用執行緒,我們勢必會浪費非常多的時間來完成整個大的事情,而使用執行緒的話將會存在這樣的問題: 主執行緒啟動所有子執行緒併發執行後主執行緒就

執行demo-執行執行交替執行

package Thread; /** * 實現效果:主執行緒執行10次,子執行緒執行100次,主執行緒和子執行緒迴圈交替執行50次     主要演示synchronized和wait、notify的使用  * 適用場景:只有兩個執行緒的情況,呵呵  */ public c

併發問題執行等待所有執行執行完畢再執行

問題引出: 我們對資料庫的操作是一個耗時過程,假如我們需要讓資料庫批量操作完成之後,再跳轉到另外一個頁面,注意:是批量操作完成之後再跳轉。 分析:以上需求我們遇到2個難點, 第一個難點是怎麼控制併發問題, 第二個難點是怎麼使主執行緒等待所有子執行緒完成之後再執行。 首先

java執行執行等待執行執行完成

Java如何等待子執行緒執行結束 今天討論一個入門級的話題, 不然沒東西更新對不起空間和域名~~ 工作總往往會遇到非同步去執行某段邏輯, 然後先處理其他事情, 處理完後再把那段邏輯的處理結果進行彙總的產景, 這時候就需要使用執行緒了. 一個執行緒啟動之後, 是非同

toast彈框、imageview、進度條、執行訪問執行執行中的通訊handler

1、imageview ?xml version="1.0" encoding="utf-8"?> <ImageView android:layout_width=“200dp” android:layout_marginLeft=“100dp” an

進度條與執行訪問執行

1.進度條(ProgressBar) 進度條的屬性: style=”?android:attr/progressBarStyleHorizontal” 預設為圓形 android:progress=”33” 進度條進行到的當前位置(去activity

Unity執行執行互動(委託方式)

using System; using System.Collections; using System.Collections.Generic; using System.Threading; using UnityEngine; /// <summary> /// 子執行緒與主執行

java併發程式設計--建立啟動執行java.lang.Thread 、java.lang.Runnable

執行緒建立的幾種方式. 建立和啟動一個執行緒 建立一個執行緒. Thread thread = new Thread(); 啟動java執行緒. thread.start(); 這兩個例子並沒有執行執行緒執行體,執行緒將會啟動後然後

java佇列、棧執行結合使用的例子

剛來公司幾天,無意中聽到其他的開發組有用到佇列這個知識點,我沒用過也沒了解過,今天花時間補補這塊知識,整理了網上的一些資料。 佇列其實 所指生活中排隊的現象,去商場購物,付款時需要排隊, 買飯時需要排隊, 好多事情都是需要排隊, 排在第一位的則先處理,結束後, 後面的人都

qt4 執行執行發訊息,發資料,通訊,qthread gui postevent emit

【轉帖請註明出處:blog.csdn.net/lanmanck】 用了qthread後,自然想起給gui執行緒傳送資料。 在qt4中,QCustomEvent已經不使用了。因為qthread是從QObject繼承的,所以可以使用signal,slot機制來通訊。 1、線

Java高併發--停止執行中斷執行

一、停止執行緒 在java中如果想要停止一個執行緒,我們可以使用stop()方法,但是建議最好不要只用這個方法,因為這個方法會破壞資料的一致性。那麼為什麼會發生這種情況呢?因為在我們呼叫Thread.stop()方法的時候,會釋放掉執行緒持有的鎖,而這個鎖就是保持執行緒一致

MFC執行訪問執行對話方塊程式的控制元件物件

       最近在使用 VC 開發軟體時需要用到多執行緒同步來解決開發過程中遇到的問題。本來以為只要象控制檯程式一樣,在主執行緒建立子執行緒,並設定好相應的物件事件就能解決問題,但是等到真正做起來,才在實踐中發現原來事情並沒有我想象的那麼簡單。以下我介紹一下我在開發過程中