6.Java多線程之間的通訊

1.線程間線程的通訊( 生產(chǎn)者,消費者,產(chǎn)品對象之間互相溝通)
2.產(chǎn)品對象Product的代碼:
public class Product {
    public  String name;
    public  double price;
    public  boolean falg = false ; // flag = false 表示還沒生產(chǎn)好
}
3.生產(chǎn)者Producter的代碼:
/**
    生產(chǎn)者的的代碼
 */
public class Producter extends  Thread{
    Product p;
    //構(gòu)造方法,目的是為了訪問共同的一個對象
    public  Producter (Product p){
        this.p = p;
    }
    @Override
    public void run() {
        int i= 0 ;
        while (true){
            synchronized (p){
                if (p.falg == false){
                    if (i%2==0){
                        p.name = "摩托車";
                        p.price = 3000;
                    }else{
                        p.name = "自行車";
                        p.price = 400;
                    }
                    System.out.println("生產(chǎn)者生產(chǎn)了:"+p.name+",價格為:"+p.price);
                    i++;
                    //改變狀態(tài)
                    p.falg = true;
                    //通知消費者消費
                    p.notify();
                }else{
                    //等待了生成了
                    try {
                        p.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
4.消費者Customer的代碼:
package com.bailing.線程通訊;

/**
    消費者
 */
public class Customer  extends  Thread{

    Product p;
    //創(chuàng)建構(gòu)造方法 (為了共享一個數(shù)據(jù))
    public  Customer(Product p){
        this.p = p;
    }
    @Override
    public void run() {
        while (true){
            synchronized (p){
                if (p.falg == true){
                    System.out.println("消費了產(chǎn)品:"+p.name+",價格為:"+p.price);
                    //改變狀態(tài)
                    p.falg = false;
                    //發(fā)送喚醒通知
                    p.notify();
                }else{
                    //要等待
                    try {
                        p.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
5.主方法調(diào)用代碼:
/**
  測試線程
                     產(chǎn)品
            (wait())
        生成者         (nofity())              消費者

 注意點:
    1.wait()和nofiy(),nofiyall()這些方法都是object的方法
    2.wait和nofity()都是要鎖對象去調(diào)用的
    3.wait和nofity()都是在同步函數(shù)和同步代碼塊里面執(zhí)行的

 wait() 方法就是釋放了鎖
 wait()就是將鎖對象為標(biāo)志的線程放入到線程池中
 nofify()就是喚醒線程池中以該鎖對象標(biāo)注的線程喚醒
 */
public class Test {
    public static void main(String[] args) {
        //創(chuàng)建一個產(chǎn)品對象,讓數(shù)據(jù)共享下
        Product product = new Product();
        //共享同一個數(shù)據(jù)
        Customer customer = new Customer(product);
        Producter producter = new Producter(product);
        //開始調(diào)用功能了
        customer.start();
        producter.start();
    }
}
2.線程同學(xué)中注意已下幾點:
通信的流程圖:
                               產(chǎn)品
            (wait())                     (wait())
        生成者         (nofity())        消費者
 注意點:
    1.wait()和nofiy(),nofiyall()這些方法都是object的方法
    2.wait和nofity()都是要鎖對象去調(diào)用的
    3.wait和nofity()都是在同步函數(shù)和同步代碼塊里面執(zhí)行的
    4.一個線程執(zhí)行了wait()方法說明改對象釋放了鎖對象
 wait() 方法就是釋放了鎖
 wait()就是將鎖對象為標(biāo)志的線程放入到線程池中
 nofify()就是喚醒線程池中以該鎖對象標(biāo)注的線程喚醒
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java-Review-Note——4.多線程 標(biāo)簽: JavaStudy PS:本來是分開三篇的,后來想想還是整...
    coder_pig閱讀 1,772評論 2 17
  • 一、進(jìn)程和線程 進(jìn)程 進(jìn)程就是一個執(zhí)行中的程序?qū)嵗總€進(jìn)程都有自己獨立的一塊內(nèi)存空間,一個進(jìn)程中可以有多個線程。...
    阿敏其人閱讀 2,711評論 0 13
  • 微蹙的眉頭 藏著些許哀傷 我從不以過來人的身份點透 因為你最怕我說你為賦新詩 故作憂愁 這就是你的青春啊 你已長大...
    幽谷百合_cd87閱讀 257評論 2 2
  • 頭像換了 網(wǎng)名換了 留言不見了 說說不見了 你的世界沒有我了 就這樣抹殺了所有事情
    戲精w閱讀 122評論 2 0
  • #20160912每天一個關(guān)鍵詞# 愛心食堂 我現(xiàn)在所處的時候,正是最好的時期:上有老而都身體安好、獨立自理,下有...
    勁汶閱讀 313評論 0 0

友情鏈接更多精彩內(nèi)容