package prouderComsumer;
//多线程间通信问题 <生产烤鸭问题>
/*在多线程通信问题中 生产这prouder 和消费者comsumer 与资源 resource 之间的关系
* 我们先说说resource 他是一个志愿 里面有属性 和生成方法 与消费方法。
* prouder & comsumer 中首先由resource的构造函数和 实现runnable的run方法并且是无线循环的。*/
//主函数:
public class ProuderComsumerDemo {
public static void main(String[] args) {
//创建资源对象 。
Resource r = new Resource();
Prouder p = new Prouder(r);//创建任务
Consmer c = new Consmer(r);//创建任务
Thread t1 =new Thread(p);
Thread t2 =new Thread(c);//创建线程
t1.start();
t2.start();
}
}
// 资源 resource
class Resource {
//属性
private String name;//烤鸭名字
private int count = 1;//烤鸭编号
private boolean falg= false;//生产与消费装换
// 生产(prouder)方法, 消费方法 consmer 方法。
public synchronized void set(String name){ //生产完了才能消费
while(falg){try {//刚开始生产不用等带
this.wait();} catch (InterruptedException e) {e.printStackTrace();}}
while(true){
this.name = name+count;
count++;
System.out.println(Thread.currentThread().getName()+"生产烤鸭"+this.name);
falg = true;
notifyAll();
}
}
public synchronized void out(){
while(!falg)
{try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}
System.out.println(Thread.currentThread().getName()+"消费烤鸭"+this.name);
falg = false;
notifyAll();
}
}
//生产者
class Prouder implements Runnable{
// 构造方法 和复写 run方法
Resource r;
public Prouder(Resource r) {
this.r = r;
}
@Override
public void run() {
while(true){
r.set("烤鸭");
}
}
}
//消费者
class Consmer implements Runnable{
Resource r;
public Consmer(Resource r) {
this.r = r;
}
public void run() {
while(true){
r.out();
}
}
}//
运行结果:Thread-0生产烤鸭烤鸭114414
Thread-0生产烤鸭烤鸭114415
Thread-0生产烤鸭烤鸭114416
Thread-0生产烤鸭烤鸭114417
Thread-0生产烤鸭烤鸭114418
Thread-0生产烤鸭烤鸭114419
Thread-0生产烤鸭烤鸭114420
Thread-0生产烤鸭烤鸭114421
Thread-0生产烤鸭烤鸭114422
Thread-0生产烤鸭烤鸭114423
Thread-0生产烤鸭烤鸭114424
Thread-0生产烤鸭烤鸭114425
Thread-0生产烤鸭烤鸭114426
Thread-0生产烤鸭烤鸭114427
Thread-0生产烤鸭烤鸭114428
Thread-0生产烤鸭烤鸭114429
Thread-0生产烤鸭烤鸭114430
Thread-0生产烤鸭烤鸭114431
Thread-0生产烤鸭烤鸭114432 后面的数组怎么回事
|
|