题目是 :一个生产者 一个消费者 生产者生产一个 消费者 拿走一个
package com.Thread;public class Demo_Text {
public static void main(String[] args) {
Buffers b = new Buffers();
new Thread(new Producter(b)).start();
new Thread(new Consumerss(b)).start();
}}class Producter implements Runnable{
Buffers b =null ;
public Producter(Buffers b){this.b = b;}
public void run() {
int i = 0 ;
while(true){
if(i==0) b.set("zShang", "male");
else b.set("lSi", "female");
i=(i+1)%2;
}
}
}class Consumerss implements Runnable{
Buffers b =null ;
public Consumerss(Buffers b){this.b = b;}
public void run() {
while (true) {
b.get();
}
}
}class Buffers{
private String name = "Unknown";
private String sex = "Unknown" ;
private boolean isFull = false;
public boolean set_ed = false;
public boolean get_ed = false;
public synchronized void set(String name ,String sex){
if(isFull)try{wait();}catch(Exception e){}
this.name = name ;
try{Thread.sleep(10);}catch(Exception e){}
this.sex = sex ;
isFull = true;
notify();
}
public synchronized void get(){
if(!isFull)try{wait();}catch(Exception e){}
System.out.print(this.name+":");
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(this.sex);
isFull = false;
notify();
}
} 代码是一个生产者和一个消费者
若是2 个生产者 和 2 个消费者 我要生产者1 生产后只准消费者1 拿走 然后在是生产者2 生产 也只准消费者2 拿走
在生产者1 .... 这样的执行 怎么思路??
package com.Thread;public class Demo_Text {
public static void main(String[] args) {
Buffers b = new Buffers();
new Thread(new Producter(b)).start();
new Thread(new Consumerss(b)).start();
}}class Producter implements Runnable{
Buffers b =null ;
public Producter(Buffers b){this.b = b;}
public void run() {
int i = 0 ;
while(true){
if(i==0) b.set("zShang", "male");
else b.set("lSi", "female");
i=(i+1)%2;
}
}
}class Consumerss implements Runnable{
Buffers b =null ;
public Consumerss(Buffers b){this.b = b;}
public void run() {
while (true) {
b.get();
}
}
}class Buffers{
private String name = "Unknown";
private String sex = "Unknown" ;
private boolean isFull = false;
public boolean set_ed = false;
public boolean get_ed = false;
public synchronized void set(String name ,String sex){
if(isFull)try{wait();}catch(Exception e){}
this.name = name ;
try{Thread.sleep(10);}catch(Exception e){}
this.sex = sex ;
isFull = true;
notify();
}
public synchronized void get(){
if(!isFull)try{wait();}catch(Exception e){}
System.out.print(this.name+":");
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(this.sex);
isFull = false;
notify();
}
} 代码是一个生产者和一个消费者
若是2 个生产者 和 2 个消费者 我要生产者1 生产后只准消费者1 拿走 然后在是生产者2 生产 也只准消费者2 拿走
在生产者1 .... 这样的执行 怎么思路??
消费者1 拿走后把自己wait() 把消费者2notify()
生产者2 生产完后 把自己给wait() 把生产者1 notify()
消费者2 拿走后把自己wait() 把消费者1notify() 在生产者1 和生产者2各自的构造方法里传buffer 和 对应的生产者对象 在消费者1 和消费者2各自的构造方法里传buffer 和 对应的消费者对象 在其中一个生产者和其中一个消费者 做个单例 好调用....
不知道行不行 . 多线程没学习. 自己的想法. 谢谢大家的解答
是不是这样:
把生产者的productId 初始都为0 ;
我把生产者1 生产的产品编号 让它的productId没生产一次就++
把生产者2 生产的产品编号 让它的productId没生产一次就--
消费者吃的时候判断生产者的productId
productId > 0 消费者1 拿走
productId < 0 消费者2 拿走 但是在确定productId 之后 让另一个消费者 等待
在生产一个productId 后让另一个生产者等待
设置下面几个同步对象object1 object2 object3 object 4 生产者一生产过后 在 object1上 notify 消费者1 在 object1上 wait 消费者1消费完毕后 在object2 上notify 生产者2在object2上wait生产者2生产后在 object3上notify 消费者2在object3上wait消费者2消费完毕后在 object4上 notify 生产者1则在object4上 wait
可以控制让 生产者1先执行 这样就可以 控制流程按照你的顺序执行
不是什么加加减减的,那还不乱套了,new Thread().currentThread().getId()这个方法可以获取到当前线程的id,将这个值赋给productId不就完了么.这里的new Thread()写你的线程对象名.
+1 使用notify()和wait()方法,此外注意使用这两个方法时需要获得对象的锁,也就是要再synchronized方法中或synchronized块中使用