最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java多線程編程學習(線程間通信)

 更新時間:2017年09月13日 09:27:43   作者:JMCui  
下面小編就為大家?guī)硪黄猨ava多線程編程學習(線程間通信)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、概要

線程是操作系統(tǒng)中獨立的個體,但這些個體如果不經過特殊的處理就不能成為一個整體,線程間的通信就是成為整體的必用方案之一。可以說,使線程進行通信后,系統(tǒng)之間的交互性會更強大,在大大提高cpu利用率的同時還會使程序員對各線程任務在處理過程中進行有效的把控和監(jiān)督。

二、等待/通知機制

1、"wait/notify"機制:等待/通知機制,wait使線程暫停運行,而notify 使暫停的線程繼續(xù)運行。用一個廚師和服務員的交互來說明:

(1) 服務員取到菜的時間取決于廚師,所以服務員就有“等待”(wait)的狀態(tài)。

(2) 廚師將菜放在“菜品傳遞臺”上,其實就相當于一種通知(notify),這時服務員才可以拿到菜并交給就餐者。

2、wait()

(1) 使當前執(zhí)行代碼的線程進行等待。wait()方法是Object類的方法,該方法用來將當前線程置入“預執(zhí)行隊列”中,并且在wait()所在的代碼行處停止執(zhí)行,直到接收通知或被中斷為止。

(2) 在調用wait()方法之前,線程必須獲得該對象的對象級別鎖,即只能在同步方法或同步塊中調用wait()方法,否則拋出IllegalMonitorStateException異常。(屬于Runtime的一個子類,不需要try-catch 語句進行捕捉異常)

(3) 在調用wait()方法之后,當前線程釋放鎖,而此對象會進入線程等待池中,等待被喚醒。在從wait()返回前,線程與其他呈wait線程競爭重新獲得鎖。

(4) wait()方法可以被interrupt 打斷并拋出InterruptedException。

(5) wait(long):帶一個參數的wait(long)方法的功能是等待某一時間內是否有線程對鎖進行喚醒,如果超過這個時間則自動喚醒。

3、notify()

(1) 用來通知那些可能等待該對象的對象鎖的其他線程。如果有多個線程等待,則由線程規(guī)劃器隨機挑選出其中一個呈wait狀態(tài)的線程,對其發(fā)出通知notify,并使它等待獲取該對象的對象鎖。(注意!這里說的是等待,即在執(zhí)行完notify()方法后,當前線程不會馬上釋放該對象鎖,即wait()狀態(tài)的線程也不會馬上獲得對象鎖,需要將synchronized 代碼塊中的代碼執(zhí)行完后才釋放鎖!)

(2)也要在同步方法或同步塊中調用,即在調用前,線程也必須獲得該對象的對象級別鎖,否則也會拋出IllegalMonitorStateException.

(3)當notify()發(fā)出通知,卻沒有wait()線程在等待時,則不作作用。

4、notifyAll()

(1) 可以使所有正在等待隊列中的 等待同一共享資源(即同一個鎖) 的"全部"線程從等待狀態(tài)退出,進入可運行狀態(tài)。

5、

6、假死:“假死”現象其實就是線程進入WAITING等待狀態(tài)。如果全部線程都進入WAITING狀態(tài),則程序就不再執(zhí)行任何功能了,整個項目呈停止狀態(tài)。 出現這樣的原因是因為:比如多個生產者和多個消費者的問題,“生產者”可能喚醒“生產者”,“消費者”可能喚醒“消費者”,喚醒了同類,導致線程不斷在等待。怎么解決這個問題呢?將notify() 改成 notifyAll()方法即可,也就是將異類一同喚醒就可以了。

7、 Jave中 管道流(pipeStream)是一種特殊的流,可用于在不同的線程中直接傳送數據。一個線程發(fā)送數據到輸出管道,另一個線程從輸入管道中讀數據。通過使用管道,實現不同線程間的通信,而無須借助于類似臨時文件之類的東西。JDK中提供了四個類來使線程間可以通信,其中包括字節(jié)流(PipedOutputStream、PipedInputStream)和字符流(PipedWriter、PipedReader)。

public class Run {
 public static void main(String[] args) {
  try {
   WriteData writeData = new WriteData();
   ReadData readData = new ReadData();
   PipedOutputStream outputStream = new PipedOutputStream();
   PipedInputStream inputStream = new PipedInputStream();
   
   outputStream.connect(inputStream);//使兩個Stream之間產生通信鏈接,這樣才可以將數據進行輸入輸出

   ThreadRead threadRead = new ThreadRead(readData, inputStream);
   threadRead.start();
   Thread.sleep(1000);
   ThreadWrite threadWrite = new ThreadWrite(writeData, outputStream);
   threadWrite.start();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
}

三、方法join的使用

1、在很多情況下,主線程創(chuàng)建并啟動子線程,如果子線程中要進行大量的耗時計算,主線程往往將早于子線程結束之前結束。這時,如果主線程想等待子線程執(zhí)行完成之后再結束,比如子線程處理一個數據,主線程要取得這個數據中的值,就要用到join()方法了。

2、join()的作用是等待線程銷毀,而使 當前線程進行無限期的阻塞,等待join()的線程銷毀后再繼續(xù)執(zhí)行當前線程的代碼。

3、同樣的,join()方法可以被interrupt()方法打斷并拋出InterruptedException異常。

4、join 與 synchronized 的區(qū)別?

(1) join()在內部使用wait() 方法進行等待。

(2) synchronized 關鍵字使用的是“對象監(jiān)視器”原理作為同步。

5、方法join(long) 和 sleep(long)的區(qū)別?

(1) join(long)內部采用wait(long)方法實現,當執(zhí)行wait(long)方法后,當前線程的鎖被釋放,那么其他線程也可以調用此線程中的同步方法了。即 join(long)之后,該線程釋放鎖,又需要和其他線程去爭搶鎖的資源。

(2) Thread.sleep(long)方法不釋放鎖。

四、類 ThreadLocal 的使用

1、變量值的共享可以使用public static 變量的形式,所有的線程都使用同一個public static 變量。如果想實現每一個線程都有自己的共享變量該如何解決呢?類ThreadLocal解決的就是每個線程綁定自己的值,可以將ThreadLocal類比喻成全局存放數據的盒子,盒子中可以存放每個線程的私有數據。

2、類ThreadLocal 具有隔離性,即每個線程都可以存入自己線程的數據而互不影響,而取到的也是自己線程存入的數據。

五、類InheritableThreadLocal的使用

1、InheritableThreadLocal類繼承于ThreadLocal類,所以它具有ThreadLocal類的特性,但又是一種特殊的ThreadLocal,其特殊性在于InheritableThreadLocal變量值會自動傳遞給所有子線程,而普通ThreadLocal變量不行;而且,通過重寫這個類中的 childValue 方法,子線程的值可以作為父線程值的一個任意函數。

備注:

(1) 什么是子線程?

包含在 Thread thread = new Thread(new ThreadStart(delegate{
}));里面均視為子線程。(個人理解)

(2) 什么是主線程?

UI界面和Main函數均為主線程,除了“不包含在Thread里面的程序”均可 視為主線程。(個人理解)

以上這篇java多線程編程學習(線程間通信)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Spring Boot兩種配置文件properties和yml區(qū)別

    Spring Boot兩種配置文件properties和yml區(qū)別

    這篇文章主要為大家介紹了java面試中常見問到的Spring Boot兩種配置文件properties和yml區(qū)別解答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • SpringBoot的@GetMapping路徑匹配規(guī)則、國際化詳細教程

    SpringBoot的@GetMapping路徑匹配規(guī)則、國際化詳細教程

    這篇文章主要介紹了SpringBoot的@GetMapping路徑匹配規(guī)則、國際化,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • JDK源碼之線程并發(fā)協(xié)調神器CountDownLatch和CyclicBarrier詳解

    JDK源碼之線程并發(fā)協(xié)調神器CountDownLatch和CyclicBarrier詳解

    我一直認為程序是對于現實世界的邏輯描述,而在現實世界中很多事情都需要各方協(xié)調合作才能完成,就好比完成一個平臺的交付不可能只靠一個人,而需要研發(fā)、測試、產品以及項目經理等不同角色人員進行通力合作才能完成最終的交付
    2022-02-02
  • java異常(Exception)處理機制詳解

    java異常(Exception)處理機制詳解

    這篇文章主要介紹了java異常(Exception)處理機制詳解的相關資料,主要介紹異常的定義及使用方法,需要的朋友可以參考下
    2017-03-03
  • Spring Boot 中使用 Mybatis Plus的操作方法

    Spring Boot 中使用 Mybatis Plus的操作方法

    本文介紹了如何在 Spring Boot 項目中集成 Mybatis Plus,Spring Boot 與 MyBatis Plus 的集成非常簡單,通過自動配置和簡潔的 API,可以大大減少開發(fā)中常見的數據庫操作代碼,需要的朋友參考下吧
    2024-12-12
  • java異常機制分析

    java異常機制分析

    這篇文章主要介紹了java異常機制,包括異常機制的捕獲、拋出及常見的異常機制總結,需要的朋友可以參考下
    2014-09-09
  • 關于Java的動態(tài)代理機制

    關于Java的動態(tài)代理機制

    這篇文章主要介紹了關于Java的動態(tài)代理機制,動態(tài)代理就是,在程序運行期,創(chuàng)建目標對象的代理對象,并對目標對象中的方法進行功能性增強的一種技術,需要的朋友可以參考下
    2023-05-05
  • Java 在volatile內部調用接口的方法

    Java 在volatile內部調用接口的方法

    在Java中,volatile?關鍵字通常用于確保變量的可見性和有序性,而不是用來修飾接口或方法調用的,這篇文章主要介紹了Java 在volatile內部調用接口的方法,需要的朋友可以參考下
    2024-07-07
  • 詳解Java8合并兩個Map中元素的正確姿勢

    詳解Java8合并兩個Map中元素的正確姿勢

    這篇文章主要介紹了詳解Java8合并兩個Map中元素的正確姿勢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Spring?Security自定義認證邏輯實例詳解

    Spring?Security自定義認證邏輯實例詳解

    這篇文章主要給大家介紹了關于Spring?Security自定義認證邏輯的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01

最新評論

五莲县| 云南省| 祁阳县| 湾仔区| 大同市| 山东| 城市| 舟曲县| 陇南市| 兴业县| 永修县| 辉南县| 福海县| 罗定市| 南雄市| 绥中县| 镇巴县| 安化县| 丹东市| 雷波县| 高邮市| 宣武区| 公安县| 大兴区| 利津县| 大同县| 浏阳市| 隆林| 章丘市| 尚志市| 景宁| 绍兴市| 寿阳县| 蒙山县| 碌曲县| 永新县| 云林县| 濮阳县| 南澳县| 陕西省| 佛山市|