欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA生產(chǎn)者消費(fèi)者(線程同步)代碼學(xué)習(xí)示例

 更新時(shí)間:2013年11月25日 16:22:56   投稿:zxhpj  
這篇文章主要介紹了JAVA線程同步的代碼學(xué)習(xí)示例,大家參考使用吧

一、問題描述

生產(chǎn)者消費(fèi)者問題是一個(gè)典型的線程同步問題。生產(chǎn)者生產(chǎn)商品放到容器中,容器有一定的容量(只能順序放,先放后拿),消費(fèi)者消費(fèi)商品,當(dāng)容器滿了后,生產(chǎn)者等待,當(dāng)容器為空時(shí),消費(fèi)者等待。當(dāng)生產(chǎn)者將商品放入容器后,通知消費(fèi)者;當(dāng)消費(fèi)者拿走商品后,通知生產(chǎn)者。

二、解決方案

對容器資源加鎖,當(dāng)取得鎖后,才能對互斥資源進(jìn)行操作。

復(fù)制代碼 代碼如下:

public class ProducerConsumerTest {
   
    public static void main(String []args){
        Container con = new Container();
        Producer p = new Producer(con);
        Consumer c = new Consumer(con);
        new Thread(p).start();
        new Thread(c).start();
    }

}


class Goods{
    int id;
    public Goods(int id){
        this.id=id;
    }
   
    public String toString(){
        return "商品"+this.id;
    }
}

class Container{//容器采用棧,先進(jìn)后出
    private int index = 0;
    Goods[] goods = new Goods[6];
   
    public synchronized void push(Goods good){
        while(index==goods.length){//當(dāng)容器滿了,生產(chǎn)者等待
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        goods[index]=good;
        index++;
        notifyAll();//當(dāng)生產(chǎn)者放入商品后通知消費(fèi)者
    }
   
    public synchronized Goods pop(){
        while(index==0){//當(dāng)容器內(nèi)沒有商品是等待
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        index--;
        notifyAll();//當(dāng)消費(fèi)者消費(fèi)了商品后通知生產(chǎn)者
        return goods[index];
    }
}

class Producer implements Runnable{
   
    Container con = new Container();
    public Producer(Container con){
        this.con=con;
    }
   
    public void run(){
        for(int i=0; i<20; i++){
            Goods good = new Goods(i);
            con.push(good);
            System.out.println("生產(chǎn)了:"+good);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
   
}

class Consumer implements Runnable{
   
    Container con = new Container();
    public Consumer(Container con){
        this.con=con;
    }
   
    public void run(){
        for(int i=0; i<20; i++){
            Goods good=con.pop();
            System.out.println("消費(fèi)了:"+good);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
   
   
}

相關(guān)文章

  • Draw.io部署詳細(xì)步驟

    Draw.io部署詳細(xì)步驟

    Draw.io 是 GitHub 上的一個(gè)開源的免費(fèi)流程圖繪制工具,功能非常的豐富,Draw.io 是開源的,所以針對外網(wǎng)訪問不穩(wěn)定或在訪問不了外網(wǎng)的情況,我們可以將其部署到我們本地,也就是把本地當(dāng)作服務(wù)端,本文將一步一步介紹具體部署步驟,感興趣的朋友一起看看吧
    2023-10-10
  • Java實(shí)現(xiàn)圖片合成的示例詳解

    Java實(shí)現(xiàn)圖片合成的示例詳解

    前端有一個(gè)神器——canvas,這個(gè)畫布標(biāo)簽可以處理各種圖片的合成,可以精確到圖片的具體坐標(biāo)。java后端也有這樣的神器,那就是image-combiner,可以很簡單的合成圖片,感興趣的可以試一試
    2022-01-01
  • 解決nacos啟動(dòng)報(bào)錯(cuò)Server check fail, please check server localhost ,port 9848 is available的問題

    解決nacos啟動(dòng)報(bào)錯(cuò)Server check fail, please che

    這篇文章主要介紹了nacos啟動(dòng) Server check fail, please check server localhost ,port 9848 is available的錯(cuò)誤原因以及解決方法,需要的朋友可以參考下
    2023-09-09
  • SpringBoot實(shí)現(xiàn)單文件與多文件上傳功能

    SpringBoot實(shí)現(xiàn)單文件與多文件上傳功能

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)單文件與多文件上傳功能,Spring?MVC對文件上傳做了簡化,而在Spring?Boot中對此做了更進(jìn)一步的簡化,文件上傳變得更為方便,下面開始演示,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-01-01
  • mybatis-plus實(shí)現(xiàn)打印完整sql語句

    mybatis-plus實(shí)現(xiàn)打印完整sql語句

    這篇文章主要介紹了mybatis-plus實(shí)現(xiàn)打印完整sql語句方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java面試題沖刺第二天--Redis篇

    Java面試題沖刺第二天--Redis篇

    這篇文章主要為大家分享了最有價(jià)值的三道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 詳解Java中String類的各種用法

    詳解Java中String類的各種用法

    Java中定義了String和StringBuffer兩個(gè)類來封裝對字符串的各種操作,存放于java.lang包中,是Java語言的核心類,提供了字符串的比較、查找、截取、大小寫轉(zhuǎn)換等操作,無需導(dǎo)入即可直接使用它們。讓我們來詳細(xì)了解它吧
    2021-11-11
  • logback-spring.xml的配置及示例詳解(直接復(fù)制粘貼可用)

    logback-spring.xml的配置及示例詳解(直接復(fù)制粘貼可用)

    在使用logback作為日志框架時(shí),可以創(chuàng)建一個(gè)名為logback-spring.xml的配置文件來自定義日志輸出的格式和方式,下面這篇文章主要給大家介紹了關(guān)于logback-spring.xml的配置及示例詳解的相關(guān)資料,文中的代碼直接復(fù)制粘貼可用,需要的朋友可以參考下
    2024-01-01
  • 詳解Elasticsearch如何實(shí)現(xiàn)簡單的腳本排序

    詳解Elasticsearch如何實(shí)現(xiàn)簡單的腳本排序

    Elasticsearch?是位于?Elastic?Stack?核心的分布式搜索和分析引擎,可以為所有類型的數(shù)據(jù)提供近乎實(shí)時(shí)的搜索和分析。本文主要介紹了Elasticsearch如何實(shí)現(xiàn)簡單的腳本排序,感興趣的可以了解一下
    2023-01-01
  • java實(shí)現(xiàn)調(diào)用http請求的五種常見方式

    java實(shí)現(xiàn)調(diào)用http請求的五種常見方式

    在實(shí)際開發(fā)過程中,我們經(jīng)常需要調(diào)用對方提供的接口或測試自己寫的接口是否合適,本文主要介紹了java實(shí)現(xiàn)調(diào)用http請求的四種常見方式,感興趣的可以了解一下
    2024-07-07

最新評論