+ -
当前位置:首页 → 问答吧 → 关于多线程 执行顺序

关于多线程 执行顺序

时间:2011-11-23

来源:互联网

题目是 :一个生产者 一个消费者 生产者生产一个 消费者 拿走一个
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 .... 这样的执行 怎么思路??

 

作者: ganhuihuikukuku   发布时间: 2011-11-23

我的想法是 生产者1 生产完后 把自己给wait() 把生产者2 notify()
  消费者1 拿走后把自己wait() 把消费者2notify()
   
  生产者2 生产完后 把自己给wait() 把生产者1 notify()
  消费者2 拿走后把自己wait() 把消费者1notify()

  在生产者1 和生产者2各自的构造方法里传buffer 和 对应的生产者对象

  在消费者1 和消费者2各自的构造方法里传buffer 和 对应的消费者对象

  在其中一个生产者和其中一个消费者 做个单例 好调用....
  不知道行不行 . 多线程没学习. 自己的想法. 谢谢大家的解答

作者: ganhuihuikukuku   发布时间: 2011-11-23

不知道你为什么要这要做,但是给你个思路吧,给馒头对象增加一个属性productId,每生产一个馒头都为这个属性赋值说明是哪个生产者生产的馒头,然后每当消费者被唤醒去吃馒头时都去判断如果不符合你的条件,让他继续睡眠,直到唤醒的是你想要的那个消费者是再继续执行代码.

作者: leilei0932_java   发布时间: 2011-11-23

这个想法是我看视频自己想的 
  是不是这样: 
  把生产者的productId 初始都为0 ;
  我把生产者1 生产的产品编号 让它的productId没生产一次就++ 
  把生产者2 生产的产品编号 让它的productId没生产一次就--
   
  消费者吃的时候判断生产者的productId 
  productId > 0 消费者1 拿走
  productId < 0 消费者2 拿走

  但是在确定productId 之后 让另一个消费者 等待
  在生产一个productId 后让另一个生产者等待

作者: ganhuihuikukuku   发布时间: 2011-11-23