1.线程间线程的通讯( 生产者,消费者,产品对象之间互相沟通)
2.产品对象Product的代码:
public class Product {
public String name;
public double price;
public boolean falg = false ; // flag = false 表示还没生产好
}
3.生产者Producter的代码:
/**
生产者的的代码
*/
public class Producter extends Thread{
Product p;
//构造方法,目的是为了访问共同的一个对象
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("生产者生产了:"+p.name+",价格为:"+p.price);
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;
//创建构造方法 (为了共享一个数据)
public Customer(Product p){
this.p = p;
}
@Override
public void run() {
while (true){
synchronized (p){
if (p.falg == true){
System.out.println("消费了产品:"+p.name+",价格为:"+p.price);
//改变状态
p.falg = false;
//发送唤醒通知
p.notify();
}else{
//要等待
try {
p.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
5.主方法调用代码:
/**
测试线程
产品
(wait())
生成者 (nofity()) 消费者
注意点:
1.wait()和nofiy(),nofiyall()这些方法都是object的方法
2.wait和nofity()都是要锁对象去调用的
3.wait和nofity()都是在同步函数和同步代码块里面执行的
wait() 方法就是释放了锁
wait()就是将锁对象为标志的线程放入到线程池中
nofify()就是唤醒线程池中以该锁对象标注的线程唤醒
*/
public class Test {
public static void main(String[] args) {
//创建一个产品对象,让数据共享下
Product product = new Product();
//共享同一个数据
Customer customer = new Customer(product);
Producter producter = new Producter(product);
//开始调用功能了
customer.start();
producter.start();
}
}
2.线程同学中注意已下几点:
通信的流程图:
产品
(wait()) (wait())
生成者 (nofity()) 消费者
注意点:
1.wait()和nofiy(),nofiyall()这些方法都是object的方法
2.wait和nofity()都是要锁对象去调用的
3.wait和nofity()都是在同步函数和同步代码块里面执行的
4.一个线程执行了wait()方法说明改对象释放了锁对象
wait() 方法就是释放了锁
wait()就是将锁对象为标志的线程放入到线程池中
nofify()就是唤醒线程池中以该锁对象标注的线程唤醒