puton 2011-11-04 16:39
浏览 230
已采纳

ExecutorSerivce 实现1个生产者多个消费者问题--- 失败,求指教求回忆

这2天学习多线程同步, 想结合ExecutorService 实现“1个生产者多个消费者”的应用, 失败了

程序思路:1个生产者 一次只能放一个鸡蛋到盘子里, 之后通知 多个消费者竞争来取

但结果是1.所有线程都在wait 并且 生产者也跑去拿鸡蛋 , 我云。这是ExecutorService托管线程的结果, 如何才能改正确呢
2.一共6个线程, FixedPoolSize是 5 , 第6个线程在什么状态才能进入就绪状态呢?

跪谢大家帮我瞧瞧了。

[code="java"]package stepbstep;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Plate {

List<Object> eggs = new ArrayList<Object>();

public synchronized Object getEgg() {
    if (eggs.size() == 0) {
        try {
            System.out.println(Thread.currentThread().getName()+" 在等待鸡蛋");
            wait();
        } catch (InterruptedException e) {
        }
    }
    System.out.println("盘子里的蛋个数 "+eggs.size());
    Object egg = (String)eggs.get(0);
    eggs.clear();// 清空盘子
    notify();// 唤醒阻塞队列的某线程到就绪队列
    System.out.println(Thread.currentThread().getName()+" 拿到鸡蛋"+egg);
    return egg;
}

public synchronized void putEgg(Object egg) {
    if (eggs.size() > 0) {
        try {
            wait();
        } catch (InterruptedException e) {
        }
    }
    eggs.add(egg);// 往盘子里放鸡蛋
    notifyAll();// 唤醒阻塞队列的某线程到就绪队列
    System.out.println(Thread.currentThread().getName()+" 放入鸡蛋"+egg);
}

static class AddThread extends Thread{
    private Plate plate;
    private Object egg=new String("No."+System.currentTimeMillis());
    public AddThread(Plate plate){
        this.plate=plate;
    }

    public void run(){
        plate.putEgg(egg);
    }
}

static class GetThread extends Thread{
    private Plate plate;
    public GetThread(Plate plate){
        this.plate=plate;
    }

    public void run(){
        for(int i=0;i<5;i++){
            plate.getEgg();
        }
    }
}

public static void main(String args[]){
    ExecutorService pool=null;
    try {
        pool = Executors.newFixedThreadPool(5);
        Plate plate=new Plate();
        Thread add=new Thread(new AddThread(plate));
        Thread get_2=new Thread(new GetThread(plate));
        Thread get_3=new Thread(new GetThread(plate));
        Thread get_4=new Thread(new GetThread(plate));
        Thread get_5=new Thread(new GetThread(plate));
        Thread get_6=new Thread(new GetThread(plate));
        pool.execute(add);
        pool.execute(get_2);
        pool.execute(get_3);
        pool.execute(get_4);
        pool.execute(get_5);
        pool.execute(get_6);

    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        pool.shutdown();
    }
}

}[/code]

错误的结果如下
[quote][color=red]pool-1-thread-1[/color] 放入鸡蛋No.1320394990548
盘子里的蛋个数 1
[color=red]pool-1-thread-1[/color] 拿到鸡蛋No.1320394990548
[color=red]pool-1-thread-1[/color] 在等待鸡蛋
pool-1-thread-4 在等待鸡蛋
pool-1-thread-5 在等待鸡蛋
pool-1-thread-3 在等待鸡蛋
pool-1-thread-2 在等待鸡蛋
[/quote]

  • 写回答

5条回答 默认 最新

  • khan7923 2011-11-05 11:36
    关注

    把生存者包装一下,弄成一个操作,什么时候需要什么时候调用不就放进去了么,你说的有点不太明白,我不清楚你要达到什么效果。你把你场景还原下。我给你做个demo

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大