1. 程式人生 > >Java執行緒之生產者和消費者

Java執行緒之生產者和消費者

Java執行緒的作用是可以使一個程式中的執行緒可以並行執行,這樣可以大大縮短程式執行所需要的時間。但是當這些執行緒都對同一個變數或者記憶體進行操作的時候如果不加以控制就會出現許多不可預見的錯誤,而且在不同時間執行也會產生不同的錯誤,並且很難排查。

對於生產者和消費者之間的關係,必須保證它們不能同時對一個儲存進行修改,即當生產者在工作時,消費者必須等候其生產完成,消費者在消費時同理,生產者也必須等候消費者工作完成之後再進行工作。下面的程式碼實現的是一個生產者和一個消費者之間的工作。它們分別生產和消費5次。

容器類:生產者和消費者都在容器中進行工作

package prodecerAndConsumer20181016.
thread; public class Basket { static int COUNT = 0;//容量 public synchronized void get(int i) { if(COUNT<=0) {//如果容器中沒有東西則掛起等待 try { this.wait();//掛起 } catch (InterruptedException e) { e.printStackTrace(); } } int tem = COUNT; tem = tem - 100; COUNT = tem; System.out.println
("第"+i+"次取錢後,餘額為:"+COUNT); this.notifyAll(); } public synchronized void put(int i) { if(COUNT>=300) {//若容器中已經存滿則掛起等待 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } int tem = COUNT; tem = tem + 100; COUNT = tem; System.out.println("第"+i+
"次存錢後,餘額為:"+COUNT); this.notifyAll(); } }

生產者類

package prodecerAndConsumer20181016.thread;

public class Producer extends Thread{
	Basket basket;
	
	
	public Producer(Basket basket) {
		super();
		this.basket = basket;
	}


	public void run() {
		for(int i=0;i<5;i++) {
			basket.put(i);//放入
		}
	}

}

消費者類

package prodecerAndConsumer20181016.thread;

public class Consumer extends Thread{
	Basket basket;

	public Consumer(Basket basket) {
		super();
		this.basket = basket;
	}
	
	public void run() {
		for(int i=0;i<5;i++) {
			basket.get(i);
		}
	}

}

主函式呼叫

package prodecerAndConsumer20181016.Main;

import prodecerAndConsumer20181016.thread.Consumer;
import prodecerAndConsumer20181016.thread.Producer;
import prodecerAndConsumer20181016.thread.Basket;

public class Main {

	public static void main(String[] args) throws InterruptedException {
		Basket basket = new Basket();
		Consumer consumer = new Consumer(basket);
		Producer producer = new Producer(basket);
		
		consumer.start();
		producer.start();
		
		//consumer.join();
		//producer.join();
		

	}

}

其他控制執行緒的方法

方法 功能
isAlive() 判斷執行緒是否終止
getPriority() 獲得執行緒優先順序數值
setPriority() 設定執行緒優先順序數值(1—10)
Thread.sleep() 使當前執行緒睡眠指定毫秒
join() 呼叫執行緒的該方法,將當前執行緒與該執行緒合併,即等待該執行緒結束再恢復當前執行緒的執行
yield 讓出CPU,當前執行緒進入就緒佇列等待排程
wait() 讓當前執行緒等待
notify()/notifyAll() 喚醒已經等待的(全部)執行緒

如果有錯誤或者高見還請指出,謝謝!

相關推薦

Java執行生產者消費者

Java執行緒的作用是可以使一個程式中的執行緒可以並行執行,這樣可以大大縮短程式執行所需要的時間。但是當這些執行緒都對同一個變數或者記憶體進行操作的時候如果不加以控制就會出現許多不可預見的錯誤,而且在不同時間執行也會產生不同的錯誤,並且很難排查。 對於生產者和消

Java執行協作--生產者消費者模式

    生產者消費者模式是執行緒協作的經典應用,主要由具體產品類,容器類,生產者執行緒,消費者執行緒組成。具體表現形式為生產者執行緒生產產品往容器裡放置,當容器滿的時候,生產執行緒呼叫wait方法,使當前執行緒阻塞,而此時消費者執行緒在不斷的消費容器裡的產品,同時呼叫noti

JAVA執行生產者消費者模式)

在生產-消費模式中:通常由兩類執行緒,即若干個生產者的執行緒和若干個消費者的執行緒。生產者執行緒負責提交使用者請求,消費者執行緒則負責具體處理生產者提交的任務,在生產者和消費者之間通過共享記憶體快取區進行通訊。 主要構成: provider:生產者執行緒負責生產資料 consume

Java執行——生產者消費者簡單實現

   生產者與消費者模式是本科課程《作業系統》中較為重要的內容之一。當時只是囫圇吞棗的理解個大概。其實生產者消費者問題是研究多執行緒程式時繞不開的經典問題之一,實質上,很多後臺服務程式併發控制的基本原理都可以歸納為生產者/消費者模式。 1、問題描述:         生產

Java執行semaphoreExchanger

Semaphore是Java執行緒的一個計數訊號量。我們可用於多執行緒的併發訪問控制。 就像我們常見的執行緒池,資料庫連線池就可以使用Semaphore進行邏輯的實現。Semaphore中我們就介紹兩個最常用的兩個方法。 acquire() 從Semaphore獲取許可,如果計數不小於0

JAVA執行生產者消費者

業務需求:      生產20個饅頭,籃子裡只能放6個饅頭。      消費者發現籃子裡有饅頭可以食用時即可把饅頭取出開始使用,直到籃子裡饅頭為空。      生產者發現籃子裡的饅頭不滿足6個時,生產者開始生產饅頭並放入籃子中。  具體實現:  第一步:建立盛放饅頭的籃子類

母雞下蛋例項:多執行通訊生產者消費者wait/notifycondition/await/signal條件佇列

## 簡介 --- 多執行緒通訊一直是高頻**面試**考點,有些面試官可能要求現場手寫**生產者/消費者**程式碼來考察多執行緒的功底,今天我們以實際生活中母雞下蛋案例用程式碼剖析下實現過程。母雞在雞窩下蛋了,叫練從雞窩裡把雞蛋拿出來這個過程,母雞在雞窩下蛋,是生產者,叫練撿出雞蛋,叫練是消費者,一進一出

JAVA執行——經典面試消費者生產者

用wait與notify、notifyAll 實現生產者與消費者 關於多執行緒的生產者與消費者有多種方式實現。目前用學過的wait、notifyAll來實現。程式碼: public class ThreadTest6 { static class

Java執行生產者消費者問題:使用synchronized 關鍵字解決生產者消費者問題

        今天看了一片博文,講Java多執行緒之執行緒的協作,其中作者用程式例項說明了生產者和消費者問題,但我及其他讀者發現程式多跑幾次還是會出現死鎖,百度搜了下大都數的例子也都存在bug,經過仔細研究發現其中的問題,並解決了,感覺有意義貼出來分享下。        

Java執行生產者消費者問題:使用重入鎖、條件變數優雅地解決生產者消費者問題

        Java5中新增了大量執行緒同步的功能,比如顯式Lock,讀寫鎖ReadWriteLock,條件變數Condition等,雖然這些功能使用之前的synchronized同步關鍵字都可能實現,但自己使用同步關鍵字不僅管理混亂,而且容易出錯。 如下是使用顯式Lo

java執行生產者消費者經典問題

看過 http://blog.csdn.net/thinkpadshi/article/details/8163751     下面的評論說:    感覺你的程式碼有問題啊,兩個run()方法裡面的列印語句的執行先後問題,假設開始在消費時index==0;這時wait()了

java執行生產者消費者佇列

package com.eshroe.sweetop.concurrency; import java.util.Random; import java.util.concurrent.Executor

Java執行interrupt()執行終止方式

1. interrupt()說明 在介紹終止執行緒的方式之前,有必要先對interrupt()進行了解。 關於interrupt(),java的djk文件描述如下:http://docs.oracle.com/javase/7/docs/api/ Interrupts this thread

java執行ReentrantLock Condition

ReentrantLock 是JDK中內建鎖,也稱可重入鎖,API也較為簡單。  Condition 可實現 執行緒間通訊,由ReentrantLock 例項產生即 lock.new Condition(); 下面這個demo模擬最簡單的生產者 消費者模式,Add執行緒模

JVM學習java執行實現&排程狀態轉換

1 謹慎使用java 多執行緒   如何提升效率:      使用java時推薦利用多執行緒處理一些操作絕大多數情況下確實能提高效率,提高效率的原理在哪裡呢,為什麼說絕大多說情況呢。        在CPU單核時代,我們知道某一時刻工作的執行緒只能是一條,那多執行緒為什

JAVA執行RunnableThread比較

在我們開發的過程中常常會碰到多執行緒的問題,對於多執行緒的實現方式主要有兩種:實現Runnable介面、繼承Thread類。對於這兩種多執行緒的實現方式也是有著一些差異。既然實現了多執行緒那必然離不開管理這些執行緒,當問題比簡單時一個或者幾個執行緒就OK了,也涉

Java執行CallableFuture介面的實現

Callable和Future     Callable介面定義了一個call方法可以作為執行緒的執行體,但call方法比run方法更強大:     A、call方法可以有返回值     B、call方法可以申明丟擲異常       Callable介面是JDK5後

執行FutureCallable【高效能應用場景java.util.concurrent】

業務場景: 如查一個數據集合,第一頁至第一百頁,返回總頁數的總結集,然後匯出。 一次需要limit 0 10000,這樣,一個SQL查詢出非常慢。 但用100個執行緒,一個執行緒只查limit0 10 就非常快了, 利用多執行緒的特性,返回多個集合,在順序合併成總集合。

java執行synchronizedvolatile關鍵字

synchronized同步方法 髒讀 在多個執行緒對同一個物件中的例項變數進行併發訪問的時候,取到的資料可能是被更改過的,稱之為“髒讀”,這就是非執行緒安全的。解決的方法為synchronized關鍵字進行同步,使之操作變成同步而非非同步。 public

執行生產者/消費者模式(值操作)

1、一個生產者,一個消費者(值操作) 本小節是典型的單個生產者,單個消費者,生產物件為值的Demo 如下,我們假設ValueObject .value為生產的值,當value的值為 “”(空串)時,我們認為生產出來的物件已被消費,當value的值不為空串時,