1. 程式人生 > >Java多執行緒2.2.執行緒間通訊

Java多執行緒2.2.執行緒間通訊

執行緒間通訊問題

1、執行緒間通訊問題

(1)執行緒間通訊問題:不同種類的執行緒之間針對同一個資源的操作。

2)通過設定執行緒(生產者)和獲取執行緒(消費者)針對同一個學生物件進行操作。

2、執行緒間通訊舉例

(1)建立學生類

package cn.itcast_03;
public class Student {
	String name;
	int age;
}

(2)建立生產者

package cn.itcast_03;
public class SetThread implements Runnable {
	private Student s;
	public SetThread(Student s) {
		this.s = s;
	}
	@Override
	public void run() {
		s.name = "林青霞";
		s.age = 27;
	}
}

(3)建立消費者

package cn.itcast_03;
public class GetThread implements Runnable {
	private Student s;
	public GetThread(Student s) {
		this.s = s;
	}
	@Override
	public void run() {
		System.out.println(s.name + "---" + s.age);
	}
}

(4)測試執行緒類:這種方式出現了問題:需要加鎖解決

package cn.itcast_03;

/*
 * 分析:
 * 		資源類:Student	
 * 		設定學生資料:SetThread(生產者)
 * 		獲取學生資料:GetThread(消費者)
 * 		測試類:StudentDemo
 * 
 * 問題1:按照思路寫程式碼,發現數據每次都是:null---0
 * 原因:我們在每個執行緒中都建立了新的資源,而我們要求的時候設定和獲取執行緒的資源應該是同一個。
 * 如何實現呢?
 * 		在外界把這個資料創建出來,通過構造方法傳遞給其他的類。
 * 
 */
public class StudentDemo {
	public static void main(String[] args) {
		//建立資源
		Student s = new Student();
		//設定和獲取的類
		SetThread st = new SetThread(s);
		GetThread gt = new GetThread(s);
		//執行緒類
		Thread t1 = new Thread(st);
		Thread t2 = new Thread(gt);
		//啟動執行緒
		t1.start();
		t2.start();
	}
}

3、執行緒間通訊舉例的問題解決

(1)建立學生類

package cn.itcast_03;
public class Student {
	String name;
	int age;
}

(2)建立生產者

package cn.itcast_04;
public class SetThread implements Runnable {
	private Student s;
	private int x = 0;
	public SetThread(Student s) {
		this.s = s;
	}
	@Override
	public void run() {
		while (true) {
			synchronized (s) {
				if (x % 2 == 0) {
					s.name = "林青霞";//剛走到這裡,就被別人搶到了執行權
					s.age = 27;
				} else {
					s.name = "劉意"; //剛走到這裡,就被別人搶到了執行權
					s.age = 30;
				}
				x++;
			}
		}
	}
}

(3)建立消費者

package cn.itcast_04;
public class GetThread implements Runnable {
	private Student s;
	public GetThread(Student s) {
		this.s = s;
	}
	@Override
	public void run() {
		while (true) {
			synchronized (s) {
				System.out.println(s.name + "---" + s.age);
			}
		}
	}
}

(4)測試執行緒類

package cn.itcast_04;

public class StudentDemo {
	public static void main(String[] args) {
		//建立資源
		Student s = new Student();
		
		//設定和獲取的類
		SetThread st = new SetThread(s);
		GetThread gt = new GetThread(s);

		//執行緒類
		Thread t1 = new Thread(st);
		Thread t2 = new Thread(gt);

		//啟動執行緒
		t1.start();
		t2.start();
	}
}

 * 分析:  *         資源類:Student      *         設定學生資料:SetThread(生產者)  *         獲取學生資料:GetThread(消費者)  *         測試類:StudentDemo  *  * 問題1:按照思路寫程式碼,發現數據每次都是:null---0  *              原因:我們在每個執行緒中都建立了新的資源,而我們要求的時候設定和獲取執行緒的資源應該是同一個!  * 如何實現呢?  *              在外界把這個資料創建出來,通過構造方法傳遞給其他的類。  * 問題2:為了資料的效果好一些,我加入了迴圈和判斷,給出不同的值,這個時候產生了新的問題  *             A:  同一個資料出現多次  *             B:  姓名和年齡不匹配  * 原因:  *             A:  同一個資料出現多次  *                   CPU的一點點時間片的執行權,就足夠你執行很多次。  *             B:  姓名和年齡不匹配  *                   執行緒執行的隨機性  * 執行緒安全問題:  *         A: 是否是多執行緒環境        是  *         B: 是否有共享資料        是  *         C: 是否有多條語句操作共享資料    是  * 解決方案: *         加鎖。  *         注意:  *             A: 不同種類的執行緒都要加鎖。  *             B: 不同種類的執行緒加的鎖必須是同一把。

4、