| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2016 人关注过本帖
标题:新手才学到线程 遇到一小问题想不明白 求大神解决
只看楼主 加入收藏
Manshow
Rank: 1
等 级:新手上路
帖 子:4
专家分:7
注 册:2016-1-15
收藏
 问题点数:0 回复次数:1 
新手才学到线程 遇到一小问题想不明白 求大神解决
程序代码:
import java.util.concurrent.locks.*;
class BoundedBuffer
{
    final Lock lock=new ReentrantLock();
    final Condition notFull=lock.newCondition();
    final Condition notEmpty=lock.newCondition();

    final Object[] items=new Object[100];
    int putptr,takeptr,count,n;
    public void put(Object x)
    {
        lock.lock();
        try
        {
            while(count==items.length)
            {
                try{notFull.await();}catch(InterruptedException e){}
            }
            items[putptr]=x;
            if(++putptr==items.length)
                putptr=0;
            count++;
            System.out.println(Thread.currentThread().getName()+"第"+count+"个object生产完毕");
            if(count==100)
                System.out.println();
            notEmpty.signal();
        }
        finally
        {
            lock.unlock();
        }
    }
    public Object take()
    {
        lock.lock();
        try
        {
            while(count==0)
            {
                try{notEmpty.await();}catch(InterruptedException e){}
            }
            Object x=items[takeptr];
            if(++takeptr==items.length)
                takeptr=0;
            System.out.println(Thread.currentThread().getName()+"第"+count+"个object已取走");
            if(count==1)
                System.out.println();
            count--;
            notFull.signal();
            return x;
        }
        finally
        {
            lock.unlock();
        }
    }
}
class Producer implements Runnable
{
    Object x=new Object();
    BoundedBuffer r;
    Producer(BoundedBuffer r)
    {
        this.r=r;
    }
    private boolean flag=true;
    public void run() 
    {
        while(flag)
            r.put(x);
            
    }
    public void getFlag()
    {
        flag=false;
    }
}
class Consumer implements Runnable
{
    BoundedBuffer r;
    Consumer(BoundedBuffer r)
    {
        this.r=r;
    }
    private boolean flag=true;
    public void run() 
    {
        while(flag)
            r.take();
    }
    public void getFlag()
    {
        flag=false;
    }
}
class  ObjectDemo 
{
    public static void main(String[] args) 
    {
        BoundedBuffer r=new BoundedBuffer();
        Producer pro=new Producer(r);
        Consumer con=new Consumer(r);

        Thread t0=new Thread(pro);
        Thread t1=new Thread(pro);
        Thread t2=new Thread(con);
        Thread t3=new Thread(con);

        t0.start();
        t1.start();
        t2.start();
        t3.start();
        /*int x=0;
        while(true)
        {
            if(x++==10000000)
            {
                pro.getFlag();
                con.getFlag();
                break;
            }
            //System.out.println(x);
        }*/
    }
}

这是运行结果(线程0,执行到54时,就换线程2运行了,不是应该到100才会换t2和t3运行吗?而换成一个pro和一个con就不会出现这样的情况,求解啊)
Thread-0第1个object生产完毕
Thread-0第2个object生产完毕
Thread-0第3个object生产完毕
Thread-0第4个object生产完毕
Thread-0第5个object生产完毕
Thread-0第6个object生产完毕
Thread-0第7个object生产完毕
Thread-0第8个object生产完毕
Thread-0第9个object生产完毕
Thread-0第10个object生产完毕
Thread-0第11个object生产完毕
Thread-0第12个object生产完毕
Thread-0第13个object生产完毕
Thread-0第14个object生产完毕
Thread-0第15个object生产完毕
Thread-0第16个object生产完毕
Thread-0第17个object生产完毕
Thread-0第18个object生产完毕
Thread-0第19个object生产完毕
Thread-0第20个object生产完毕
Thread-0第21个object生产完毕
Thread-0第22个object生产完毕
Thread-0第23个object生产完毕
Thread-0第24个object生产完毕
Thread-0第25个object生产完毕
Thread-0第26个object生产完毕
Thread-0第27个object生产完毕
Thread-0第28个object生产完毕
Thread-0第29个object生产完毕
Thread-0第30个object生产完毕
Thread-0第31个object生产完毕
Thread-0第32个object生产完毕
Thread-0第33个object生产完毕
Thread-0第34个object生产完毕
Thread-0第35个object生产完毕
Thread-0第36个object生产完毕
Thread-0第37个object生产完毕
Thread-0第38个object生产完毕
Thread-0第39个object生产完毕
Thread-0第40个object生产完毕
Thread-0第41个object生产完毕
Thread-0第42个object生产完毕
Thread-0第43个object生产完毕
Thread-0第44个object生产完毕
Thread-0第45个object生产完毕
Thread-0第46个object生产完毕
Thread-0第47个object生产完毕
Thread-0第48个object生产完毕
Thread-0第49个object生产完毕
Thread-0第50个object生产完毕
Thread-0第51个object生产完毕
Thread-0第52个object生产完毕
Thread-0第53个object生产完毕
Thread-0第54个object生产完毕
Thread-2第54个object已取走
Thread-2第53个object已取走
Thread-2第52个object已取走
Thread-2第51个object已取走
Thread-2第50个object已取走
Thread-2第49个object已取走
Thread-2第48个object已取走
Thread-2第47个object已取走
Thread-2第46个object已取走
Thread-2第45个object已取走
Thread-2第44个object已取走
Thread-2第43个object已取走
Thread-2第42个object已取走
Thread-2第41个object已取走
Thread-2第40个object已取走
Thread-2第39个object已取走
Thread-2第38个object已取走
Thread-2第37个object已取走
Thread-2第36个object已取走
Thread-2第35个object已取走
Thread-2第34个object已取走
Thread-2第33个object已取走
Thread-2第32个object已取走
Thread-2第31个object已取走
Thread-2第30个object已取走
Thread-2第29个object已取走
Thread-2第28个object已取走
Thread-2第27个object已取走
Thread-2第26个object已取走
Thread-2第25个object已取走
Thread-2第24个object已取走
Thread-2第23个object已取走
Thread-2第22个object已取走
Thread-2第21个object已取走
Thread-2第20个object已取走
Thread-2第19个object已取走
Thread-2第18个object已取走
Thread-2第17个object已取走
Thread-2第16个object已取走
Thread-2第15个object已取走
Thread-2第14个object已取走
Thread-2第13个object已取走
Thread-2第12个object已取走
Thread-2第11个object已取走
Thread-2第10个object已取走
Thread-2第9个object已取走
Thread-2第8个object已取走
Thread-2第7个object已取走
Thread-2第6个object已取走
Thread-2第5个object已取走
Thread-2第4个object已取走
Thread-2第3个object已取走
Thread-2第2个object已取走
Thread-2第1个object已取走
搜索更多相关主题的帖子: count 
2016-02-20 23:42
Manshow
Rank: 1
等 级:新手上路
帖 子:4
专家分:7
注 册:2016-1-15
收藏
得分:0 
自己理解错误,已想明白
2016-02-21 00:30
快速回复:新手才学到线程 遇到一小问题想不明白 求大神解决
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021663 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved