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)系作者