java多執行緒解決同步問題的幾種方式、原理和程式碼
生產者類:
publicclassProducerextendsThread{// 每次生產的產品數量privateint num;// 所在放置的倉庫privateStorage storage;// 建構函式,設定倉庫publicProducer(Storage storage){this.storage = storage;}// 執行緒run函式publicvoid run(){
produce(num);}// 呼叫倉庫Storage的生產函式publicvoid produce(int num){
storage.produce(num);}publicint getNum(){return num;}publicvoid setNum(int num){this.num = num;}publicStorage getStorage(){return storage;}publicvoid setStorage(Storage storage){this.storage = storage;}}
消費者類:
publicclassConsumerextendsThread{// 每次消費的產品數量privateint num;// 所在放置的倉庫privateStorage storage;// 建構函式,設定倉庫publicConsumer(Storage storage){this.storage = storage;}// 執行緒run函式publicvoid run(){
consume(num);}// 呼叫倉庫Storage的生產函式publicvoid consume(int num){
storage.consume(num);}// get/set方法publicint getNum(){return num;}publicvoid setNum(int num){this.num = num;}publicStorage getStorage(){return storage;}publicvoid setStorage (Storage storage){this.storage = storage;}}
倉庫類:(wait()/notify()方法)
publicclassStorage{// 倉庫最大儲存量privatefinalint MAX_SIZE =100;// 倉庫儲存的載體privateLinkedList<Object> list =newLinkedList<Object>();// 生產num個產品publicvoid produce(int num){// 同步程式碼段synchronized(list){// 如果倉庫剩餘容量不足while(list.size()+ num > MAX_SIZE){//相當於緩衝區滿,生產者則等待System.out.print("【要生產的產品數量】:"+ num);System.out.println(" 【庫存量】:"+ list.size()+" 暫時不能執行生產任務!");try{
list.wait();// 由於條件不滿足,生產阻塞}catch(InterruptedException e){
e.printStackTrace();}}// 生產條件滿足情況下,生產num個產品for(int i =1; i <= num;++i){
list.add(newObject());}System.out.print("【已經生產產品數】:"+ num);System.out.println(" 【現倉儲量為】:"+ list.size());
list.notifyAll();}}// 消費num個產品publicvoid consume(int num){// 同步程式碼段synchronized(list){// 如果倉庫儲存量不足while(list.size()< num){//相當於緩衝區空,消費者則等待System.out.print("【要消費的產品數量】:"+ num);System.out.println(" 【庫存量】:"+ list.size()+" 暫時不能執行生產任務!");try{// 由於條件不滿足,消費阻塞
list.wait();}catch(InterruptedException e){
e.printStackTrace();}}// 消費條件滿足情況下,消費num個產品for(int i =1; i <= num;++i){
list.remove();}System.out.print("【已經消費產品數】:"+ num);System.out.println(" 【現倉儲)量為】:"+ list.size());
list.notifyAll();}}// get/set方法publicLinkedList<Object> getList(){return list;}publicvoid setList(LinkedList<Object> list){this.list = list;}publicint getMAX_SIZE(){return MAX_SIZE;}}
相關推薦
java多執行緒解決同步問題的幾種方式、原理和程式碼
生產者類: publicclassProducerextendsThread{// 每次生產的產品數量privateint num;// 所在放置的倉庫privateStorage storage;// 建構函式,設定倉庫publicProducer(Storage storage){this.stora
JAVA多執行緒實現的幾種方式及簡單示例
JAVA多執行緒的實現方式是JAVA基礎的一個重點,看過好多次,但不經常用就容易忘記,今天做一個總結,算是把JAVA基礎再夯實一下。 Java多執行緒實現方式主要有四種:繼承Thread類、實現Runnable介面、實現Callable介面通過FutureTask包裝器來
Java多執行緒有哪幾種實現方式? Java中的類如何保證執行緒安全? 請說明ThreadLocal的用法和適用場景(面試題)
Java多執行緒有哪幾種實現方式? Java中的類如何保證執行緒安全? 請說明ThreadLocal的用法和適用場景 Java多執行緒有三種實現方式: (1)繼承Thread類,重寫run函式 (2)實現Runnable介面,重寫run函式 開啟執行緒:Thread t
java間執行緒通訊的幾種方式(II)
1.如何讓兩個執行緒嫩能夠交叉執行 要讓執行緒能夠交叉執行,需要用到鎖。看如下程式碼: package Test;/** /** * @author Administrator wangtao * @createdate 2017-10-10 */ public class
Java多執行緒建立的三種方式與對比
一、繼承Thread類建立執行緒類 1、定義Thread類的子類,並重寫該類的run()方法,該run()方法的方法體代表了執行緒需要完成的任務,即執行緒的執行體。 2、建立Thread子類的例項,即建立執行緒物件。 3、呼叫執行緒物件的start()方法來啟動該執行緒
Java 多執行緒下,2種安全、效能靠譜的單例模式
懶漢式-雙重核驗: package com.zzf.concurrence.singleinstance; /** * 懶漢式-雙重核驗 * @author zzf * */ public class SingleEHan { private Single
JAVA多執行緒實現的四種方式
昨天自己用ExecutorService建立執行緒池做穿透測試了一下,感覺挺有意思,所以又好好的看了一下執行緒的問題,在此轉載了一篇博友的文章,感覺總結的不錯,所以分享一下. Java多執行緒實現方式主要有四種: 繼承Thread類、實現Runnable
JAVA多執行緒實現的三種方式及內部原理
JAVA多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完
JAVA多執行緒實現的三種方式
JAVA多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,只有最後一種是帶返回值的。 1、繼承Thread類實現多
java--(多執行緒建立的兩種方式Thread類和Runnable介面)
(一)繼承Thread類建立多執行緒----單執行緒下面的程式碼是一個死迴圈,但是不會執行main裡面的迴圈語句,而是run()裡面的語句,這是因為該程式是一個單執行緒程式,當呼叫MyThread類的run()方法時,遇到死迴圈,迴圈一直進行。因此,MyThread類的列印
JAVA多執行緒實現的3種方式
JAVA多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,只有最後一種是帶返回值的。 1、繼承Thread類實
JAVA多執行緒實現的三種方式(繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒)
JAVA多執行緒實現方式 JAVA多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,只有最後一種是帶返回值的。
java多執行緒實現的兩種方式。
java自帶主要有兩種實現多執行緒的方式。第一種:繼承執行緒類Thread,重新run的方法。第二種:實現介面Runnable,重新run方法。我先不說明他們的區別。先看程式碼的實現。第一種方式:public class MyThread extends Thread {
Java多執行緒之AQS(AbstractQueuedSynchronizer )實現原理和原始碼分析(三)
章節概覽、 1、回顧 上一章節,我們分析了ReentrantLock的原始碼: 2、AQS 佇列同步器概述 本章節我們深入分析下AQS(AbstractQueuedSynchronizer)佇列同步器原始碼,AQS是用來構建鎖或者其他同步元件的基礎框架。
JAVA之多執行緒概念及其幾種實現方法優劣分析
1. 多執行緒 程式:指令集,靜態的概念 程序:作業系統調動程式,是程式的一次動態執行過程,動態的概念 執行緒:在程序內的多條執行路徑 Ps:單核的話程序都是虛擬模擬出來的,多核處理器才可以執行真正的多執行緒 單核通過CPU排程時間片實現虛擬模擬的多執行緒,比如執行main函式和GC在底層就是多執行
Java多執行緒學習(十):AQS 原理以及 AQS 同步元件總結
常見問題:AQS 原理?;CountDownLatch和CyclicBarrier瞭解嗎,兩者的區別是什麼?用過Semaphore嗎? 本節思維導圖: 阿里雲產品 1888 代金券領取:https://promotion.aliyun.com/ntms
python中多執行緒開啟的兩種方式(內含有event的應用,即安全的機制,類似於java的等待喚醒機制,不會出現多個執行緒之間的錯亂問題)
event是類似於java中的等待喚醒機制,具體方法參照上一篇CSDN 下面來介紹開啟執行緒的第一種方式 #Filename:threading1.py #開啟執行緒的第一種方式 import threading import time event=threadin
Java學習筆記(一) Java多執行緒 synchronized同步方法
1.提出問題-例項變數非執行緒安全 如果多個執行緒同時訪問1個物件的例項變數,則可能出現"非執行緒安全"問題。 1.1 何為非執行緒安全? 我的理解是多個執行緒對一個例項變數操作會出現值被更改,不同步的情況。 1.2 舉例 1.2.1 有私有變數的類HasPr
Java學習筆記(二) Java多執行緒 synchronized同步方法-防止髒讀
1. 髒讀 在給一個物件賦值的時候進行了同步, 但是在取值的時候可能出現意外,此值已經被其他執行緒修改了,這種情況就是髒讀 1.1 PublicVar類 public class PublicVar { public String userName =
Java多執行緒的同步機制(synchronized)
原文地址 一段synchronized的程式碼被一個執行緒執行之前,他要先拿到執行這段程式碼的許可權,在 java裡邊就是拿到某個同步物件的鎖(一個物件只有一把鎖); 如果這個時候同步物件的鎖被其他執行緒拿走了,他(這個執行緒)就只能等了(執行緒阻塞在鎖池 等待佇列中)。 取到鎖後,他就開始執行同步程式碼