六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 48|回复: 0

生产者消费者JAVA队列实现

[复制链接]

升级  10.67%

16

主题

16

主题

16

主题

秀才

Rank: 2

积分
66
 楼主| 发表于 2013-1-27 04:56:48 | 显示全部楼层 |阅读模式
class SyncQueue...{    private int head=0;//队头    private int tail=1;//队尾    public final int Num=6;//缓冲区大小    public char data[]=new char[Num];    public  synchronized void inqueue(char c)...{        while((tail+1)%Num==head)...{            try...{                this.wait();            }catch(InterruptedException e)...{System.out.println(e);}                    }        this.notify();                    data[tail]=c;            tail=(tail+1)%Num;            System.out.println("produced:" + c );                    }    public  synchronized char outqueue()...{        while((head+1)%Num==tail)...{            try...{                this.wait();            }catch(InterruptedException e)...{System.out.println(e);}        }            this.notify();                        head=(head+1)%Num;                        System.out.println("消费:"+data[head]);            return data[head];                }}

class Producer implements Runnable...{    SyncQueue queue;    public Producer(SyncQueue s)...{        queue=s;    }    public void run()...{        for(int i=0;i<20;i++)...{            char c=(char)(Math.random()*26+'A');            queue.inqueue(c);            try...{                Thread.sleep((int)(Math.random()*20));            }catch(InterruptedException e)...{System.out.println(e);}        }    }}


class Customer implements Runnable...{    SyncQueue queue;    public Customer(SyncQueue s)...{        queue=s;    }    public void run()...{        for(int i=0;i<20;i++)...{            char c=queue.outqueue();            try...{                Thread.sleep((int)(Math.random()*20));            }catch(InterruptedException e)...{System.out.println(e);}        }    }}


public class SyncTest...{    public static void main (String[] args) ...{        SyncQueue queue=new SyncQueue();        Runnable p=new Producer(queue);        Runnable c=new Customer(queue);        Thread t1=new Thread(p);        Thread t2=new Thread(c);        t1.start();        t2.start();            }}

注:注意wait()和notify()的位置,否则将引者死锁的发生。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表