亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java線程間通信的通俗解釋及代碼示例

2024-07-13 10:13:55
字體:
來源:轉載
供稿:網友

java/282841.html">線程間通信:由于多線程共享地址空間和數據空間,所以多個線程間的通信是一個線程的數據可以直接提供給其他線程使用,而不必通過操作系統(也就是內核的調度)。

進程間的通信則不同,它的數據空間的獨立性決定了它的通信相對比較復雜,需要通過操作系統。以前進程間的通信只能是單機版的,現在操作系統都繼承了基于套接字(socket)的進程間的通信機制。這樣進程間的通信就不局限于單臺計算機了,實現了網絡通信。線程通信主要分為以下幾個部分,下面通過生活中圖書館借書的例子簡單講解以下:

通過共享對象通信

加入圖書館只有一本《java并發編程實戰》,小A早上的時候把這本書給借走了,然后下午小B去圖書館去找這本書,這時候小A和小B是兩個線程,《java并發編程實戰》就是共享對象(類似于多線程中的全局變量的資源),小B發現這本書已經被借走了,所以就回去等了幾天,幾天后,小B又去圖書館發現這本書被還回來了,就把書借走了,這就是通過共享對象進行通信。

忙等待

由于快要BAT實習生招聘了,所以小B非常想看這本書,所以小B就每隔一個小時(while循環)就去看看這本書有沒有被還回來了,這樣雖然比較耗費處理器資源,但是只要書一旦被還回來,小B就可以馬上知道。

wait() notify() notifyAll()

由于圖書館隔著宿舍比較近,所以小B發現每隔一個小時就去圖書館身體有點吃不消,不過很快,學校的圖書館系統增加了短信提醒功能(notify()),所以小B可以一邊睡覺一邊等短信。

丟失的信號

圖書館系統是這么設計的,當有一本書被還回來的時候,就會給等待者發短信,但是短信只能發送一次,如果沒有等待者,短信也會發出(只不過這個時候沒有沒有接受者),問題出現了,因為短信只會發一次,當書被還回來的時候,沒有人等待借書,他會發一條空短信,但是之后有等待借此本書的同學永遠也不會再收到短信,導致這些同學會無休止的等待。為了解決這個問題,我們要進入等待狀態的時候先打電話問問圖書館阿姨是否需要繼續等待。

假喚醒

圖書館系統有一個bug,會是不是給用戶發送錯誤短信,我們很聽話,收到短信就會去圖書館借書,但是到達圖書館后發現書根本就沒有被還回來,然后接著做其他的事情。

線程間的通信方式

#鎖機制:包括互斥鎖、條件變量、讀寫鎖

*互斥鎖提供了以排他方式防止數據結構被并發修改的方法。

*讀寫鎖允許多個線程同時讀共享數據,而對寫操作是互斥的。

*條件變量可以以原子的方式阻塞進程,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。

#信號量機制(Semaphore):包括無名線程信號量和命名線程信號量

#信號機制(Signal):類似進程間的信號處理

線程間的通信目的主要是用于線程同步,所以線程沒有像進程通信中的用于數據交換的通信機制。

我覺得我對線程通信的理解還是不夠徹底,下面分享幾段代碼,幫助理解:

①同步

這里講的同步是指多個線程通過synchronized關鍵字這種方式來實現線程間的通信。

參考示例:

public class MyObject {	synchronized public void methodA() {		//do something....	}	synchronized public void methodB() {		//do some other thing	}}public class ThreadA extends Thread {	private MyObject object;	//省略構造方法	@Override	 public void run() {		super.run();		object.methodA();	}}public class ThreadB extends Thread {	private MyObject object;	//省略構造方法	@Override	 public void run() {		super.run();		object.methodB();	}}public class Run {	public static void main(String[] args) {		MyObject object = new MyObject();		//線程A與線程B 持有的是同一個對象:object		ThreadA a = new ThreadA(object);		ThreadB b = new ThreadB(object);		a.start();		b.start();	}}

由于線程A和線程B持有同一個MyObject類的對象object,盡管這兩個線程需要調用不同的方法,但是它們是同步執行的,比如:線程B需要等待線程A執行完了methodA()方法之后,它才能執行methodB()方法。這樣,線程A和線程B就實現了通信。

這種方式,本質上就是“共享內存”式的通信。多個線程需要訪問同一個共享變量,誰拿到了鎖(獲得了訪問權限),誰就可以執行。

②while輪詢的方式

代碼如下:

import java.util.ArrayList;import java.util.List;public class MyList {	private List<String> list = new ArrayList<String>();	public void add() {		list.add("elements");	}	public int size() {		return list.size();	}}import mylist.MyList;public class ThreadA extends Thread {	private MyList list;	public ThreadA(MyList list) {		super();		this.list = list;	}	@Override	 public void run() {		try {			for (int i = 0; i < 10; i++) {				list.add();				System.out.println("添加了" + (i + 1) + "個元素");				Thread.sleep(1000);			}		}		catch (InterruptedException e) {			e.printStackTrace();		}	}}import mylist.MyList;public class ThreadB extends Thread {	private MyList list;	public ThreadB(MyList list) {		super();		this.list = list;	}	@Override	 public void run() {		try {			while (true) {				if (list.size() == 5) {					System.out.println("==5, 線程b準備退出了");					throw new InterruptedException();				}			}		}		catch (InterruptedException e) {			e.printStackTrace();		}	}}import mylist.MyList;import extthread.ThreadA;import extthread.ThreadB;public class Test {	public static void main(String[] args) {		MyList service = new MyList();		ThreadA a = new ThreadA(service);		a.setName("A");		a.start();		ThreadB b = new ThreadB(service);		b.setName("B");		b.start();	}}

在這種方式下,線程A不斷地改變條件,線程ThreadB不停地通過while語句檢測這個條件(list.size()==5)是否成立 ,從而實現了線程間的通信。但是這種方式會浪費CPU資源。之所以說它浪費資源,是因為JVM調度器將CPU交給線程B執行時,它沒做啥“有用”的工作,只是在不斷地測試 某個條件是否成立。就類似于現實生活中,某個人一直看著手機屏幕是否有電話來了,而不是: 在干別的事情,當有電話來時,響鈴通知TA電話來了。關于線程的輪詢的影響

③wait/notify機制

代碼如下:

import java.util.ArrayList;import java.util.List;public class MyList {	private static List<String> list = new ArrayList<String>();	public static void add() {		list.add("anyString");	}	public static int size() {		return list.size();	}}public class ThreadA extends Thread {	private Object lock;	public ThreadA(Object lock) {		super();		this.lock = lock;	}	@Override	 public void run() {		try {			synchronized (lock) {				if (MyList.size() != 5) {					System.out.println("wait begin "					    + System.currentTimeMillis());					lock.wait();					System.out.println("wait end "					    + System.currentTimeMillis());				}			}		}		catch (InterruptedException e) {			e.printStackTrace();		}	}}public class ThreadB extends Thread {	private Object lock;	public ThreadB(Object lock) {		super();		this.lock = lock;	}	@Override	 public void run() {		try {			synchronized (lock) {				for (int i = 0; i < 10; i++) {					MyList.add();					if (MyList.size() == 5) {						lock.notify();						System.out.println("已經發出了通知");					}					System.out.println("添加了" + (i + 1) + "個元素!");					Thread.sleep(1000);				}			}		}		catch (InterruptedException e) {			e.printStackTrace();		}	}}public class Run {	public static void main(String[] args) {		try {			Object lock = new Object();			ThreadA a = new ThreadA(lock);			a.start();			Thread.sleep(50);			ThreadB b = new ThreadB(lock);			b.start();		}		catch (InterruptedException e) {			e.printStackTrace();		}	}}

線程A要等待某個條件滿足時(list.size()==5),才執行操作。線程B則向list中添加元素,改變list的size。

A,B之間如何通信的呢?也就是說,線程A如何知道list.size()已經為5了呢?

這里用到了Object類的wait()和notify()方法。

當條件未滿足時(list.size()!=5),線程A調用wait()放棄CPU,并進入阻塞狀態。---不像②while輪詢那樣占用CPU

當條件滿足時,線程B調用notify()通知線程A,所謂通知線程A,就是喚醒線程A,并讓它進入可運行狀態。

這種方式的一個好處就是CPU的利用率提高了。

但是也有一些缺點:比如,線程B先執行,一下子添加了5個元素并調用了notify()發送了通知,而此時線程A還執行;當線程A執行并調用wait()時,那它永遠就不可能被喚醒了。因為,線程B已經發了通知了,以后不再發通知了。這說明:通知過早,會打亂程序的執行邏輯。

④管道通信就是使用java.io.PipedInputStream和java.io.PipedOutputStream進行通信

具體就不介紹了。分布式系統中說的兩種通信機制:共享內存機制和消息通信機制。感覺前面的①中的synchronized關鍵字和②中的while輪詢“屬于”共享內存機制,由于是輪詢的條件使用了volatile關鍵字修飾時,這就表示它們通過判斷這個“共享的條件變量“是否改變了,來實現進程間的交流。

而管道通信,更像消息傳遞機制,也就是說:通過管道,將一個線程中的消息發送給另一個。

總結

以上就是本文關于java線程間通信的通俗解釋的全部內容,希望對大家有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人a亚洲精品| 国产一区二区三区日韩欧美| 亚洲精品国精品久久99热一| 亚洲iv一区二区三区| 久久久久国产一区二区三区| 国产日韩欧美一二三区| 亚洲视频电影图片偷拍一区| 欧美一级视频免费在线观看| 欧美精品videosex牲欧美| 欧美激情第一页xxx| 久久99精品国产99久久6尤物| 91九色国产社区在线观看| 色999日韩欧美国产| 亚洲国产高潮在线观看| 成人免费视频在线观看超级碰| 国产剧情日韩欧美| 成人精品视频99在线观看免费| 日韩成人在线视频网站| 午夜精品在线观看| 亚洲第一色在线| 97视频在线观看免费高清完整版在线观看| 久久精品91久久香蕉加勒比| 97在线精品视频| 亚洲天堂av在线免费观看| 欧美一级片一区| 欧美性生交xxxxx久久久| 国产精品伦子伦免费视频| 91久久精品美女| 亚洲激情久久久| 亚洲免费av网址| 国产精品视频网| 这里只有精品在线播放| 欧美高清不卡在线| 精品久久久在线观看| 欧美激情啊啊啊| 在线播放精品一区二区三区| 国产美女主播一区| 成人免费观看49www在线观看| 成人av在线天堂| 97欧美精品一区二区三区| 色多多国产成人永久免费网站| 精品国产拍在线观看| 欧美一级片一区| 欧美国产精品va在线观看| 精品国产区一区二区三区在线观看| 九色精品免费永久在线| 亚洲国产天堂久久国产91| 亚洲国产欧美自拍| 综合av色偷偷网| 日韩精品视频在线观看网址| 欧美日韩国产黄| 国产精品久久久久久久久粉嫩av| 成人久久久久久久| 青青在线视频一区二区三区| 欧美视频专区一二在线观看| 色伦专区97中文字幕| 在线看国产精品| 欧美性色19p| 国产精品99导航| 国产精品夜间视频香蕉| 92看片淫黄大片欧美看国产片| 国产精品美女999| 成人国产精品一区| 日韩欧美成人精品| 国产日韩精品入口| 欧美诱惑福利视频| 国产精品视频26uuu| 日本一区二区在线免费播放| 亚洲精品国精品久久99热一| 亚洲淫片在线视频| 57pao国产精品一区| 色中色综合影院手机版在线观看| 欧美猛男性生活免费| 欧美高清自拍一区| 久久久久久久一区二区| 日本亚洲精品在线观看| 成人做爽爽免费视频| 国产精品草莓在线免费观看| 91精品国产91| 九九综合九九综合| 91精品国产综合久久香蕉922| 国产婷婷成人久久av免费高清| 在线日韩日本国产亚洲| 亚洲精品成人av| 97久久精品视频| 色偷偷综合社区| 国产精品香蕉av| 亚洲国产欧美久久| 日韩视频第一页| 亚洲精品国产精品国自产观看浪潮| 国产成人高清激情视频在线观看| 91精品国产亚洲| 亚洲国产精品小视频| 亚洲欧美资源在线| 日韩精品视频中文在线观看| 欧美高清无遮挡| 91国内免费在线视频| 国内外成人免费激情在线视频| 亚洲国产日韩欧美在线图片| 久久91超碰青草是什么| 欧美视频在线免费看| 亚洲第一级黄色片| 91影院在线免费观看视频| 国产精品中文久久久久久久| 日韩欧美在线一区| 69av在线播放| 日韩网站在线观看| 精品亚洲国产成av人片传媒| 深夜成人在线观看| 亚洲精品videossex少妇| 国产日韩欧美夫妻视频在线观看| 久久久久久网址| 国产亚洲欧美日韩精品| 久久久久久久一区二区| 亚洲国产精品久久久久秋霞蜜臀| 亚洲欧美日韩国产成人| 亚洲精品电影网在线观看| 欧美精品aaa| 97婷婷大伊香蕉精品视频| 国产精品小说在线| 国产精品久久婷婷六月丁香| 国产啪精品视频网站| 蜜臀久久99精品久久久无需会员| 日韩av免费在线观看| 91精品国产色综合久久不卡98口| 一区二区三区四区在线观看视频| 午夜精品久久久久久久99热| 久久久久久18| 亚洲欧美日韩直播| 久久精品精品电影网| 亚洲精品videossex少妇| 成人中文字幕在线观看| 久久久久久久久久国产精品| 久久久久一本一区二区青青蜜月| 亚洲欧美日本另类| 国产精品成人观看视频国产奇米| 亚洲精品视频免费| 中文字幕国产日韩| 国产成人avxxxxx在线看| 色午夜这里只有精品| 亚洲欧美日韩一区二区在线| 欧美精品成人91久久久久久久| 国产精品扒开腿做爽爽爽视频| 日韩视频永久免费观看| 国内免费精品永久在线视频| 欧美性高跟鞋xxxxhd| 日韩av在线精品| 久久国产精品久久国产精品| 欧美精品在线第一页| 日韩在线中文字| 欧美一级大片视频| 日韩成人高清在线| 午夜精品一区二区三区视频免费看| 国产一区二区视频在线观看| 在线视频精品一| 91av成人在线| 高清欧美电影在线| 欧美日韩国产综合视频在线观看中文| 日韩欧美中文字幕在线观看| 欧美激情一二区| 中文字幕综合在线| 综合国产在线观看| 欧美日韩第一视频| 少妇高潮久久久久久潘金莲|