A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhoubinjian 金牌黑马   /  2016-4-5 02:16  /  2928 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

3黑马币
本帖最后由 zhoubinjian 于 2016-4-7 17:26 编辑

/*
以下代码已更正,谢谢黑友们的回复。。
*/

import java.util.concurrent.locks.*;
class Res
{
        private String name;
        private String sex;
        boolean flag=false;
        private Lock lock=new ReentrantLock();
        private Condition condition_ru = lock.newCondition();
        private Condition condition_chu = lock.newCondition();

        public void setNum(String name,String sex)throws InterruptedException
        {
                lock.lock();
                try
                {
                        while(flag)
                       
                                condition_ru.await();
                        this.name=name;
                        this.sex=sex;
                        flag=true;
                        condition_chu.signal();
                       
                }
                               
               
                finally
                {
                        lock.unlock();
                }
        }
        public void out()throws InterruptedException
        {
                lock.lock();
                try
                {
                        while(!flag)
                       
                                condition_chu.await();
                                System.out.println(name+"----"+sex);
                        flag=false;
                        condition_ru.signal();
                       
                }                               
               
                finally
                {
                        lock.unlock();
                }
        }
}
class Intput implements Runnable
{
        private Res r;
        Intput(Res r)
        {
                this.r=r;
        }
        public void run()
        {
                int x=0;
                while(true)
                {       
                        try{
                                        if(x==0)                               
                                                r.setNum("zhoubin","men");                                               
                                        else                               
                                                r.setNum("lili","women");                               
                                        x=(x+1)%2;
                                }
                                catch(InterruptedException e){}
                       
                }
        }
}

class Output implements Runnable
{
        private Res r;
        Output(Res r)
        {
                this.r=r;
        }
        public void run()
        {
                while(true)
                {
                        try{
                                r.out();
                           }
                           catch(InterruptedException e){}
                }
        }
}

class Demo
{
        public static void main(String[] args)
                {
                       
                        Res r=new Res();
                        new Thread(new Intput(r)).start();
                        new Thread(new Output(r)).start();
                        //new Thread(new Output(r)).start();
                        //new Thread(new Output(r)).start();

                        /*
                        Intput in=new Intput(r);
                        Output ou=new Output(r);
               
                        Thread t1=new Thread(in);
                        Thread t2=new Thread(ou);
                       
                        t1.start();
                        t2.start();
                        */
                }
}



1463.tmp.png (75.9 KB, 下载次数: 15)

1463.tmp.png

最佳答案

查看完整内容

this.name=name; this.sex=sex; flag=true; condition_chu.signal(); 这段代码写在while语句外面试试

13 个回复

倒序浏览
                        this.name=name;
                        this.sex=sex;
                        flag=true;
                        condition_chu.signal();
这段代码写在while语句外面试试
回复 使用道具 举报
等号前后是不是都没加空格
回复 使用道具 举报
Res.out这个方法里: lock.lock();你写成了clok.clok();
回复 使用道具 举报
adomwon 发表于 2016-4-5 09:06
等号前后是不是都没加空格

这个 没有关系的
回复 使用道具 举报
15614014298 发表于 2016-4-5 19:43
Res.out这个方法里: lock.lock();你写成了clok.clok();

好的,谢谢,已改,不过错误还是一样的
回复 使用道具 举报
你导包了没有

评分

参与人数 1黑马币 +1 收起 理由
zhoubinjian + 1 赞一个!

查看全部评分

回复 使用道具 举报
看看是不是没导包

评分

参与人数 1黑马币 +1 收起 理由
zhoubinjian + 1 赞一个!

查看全部评分

回复 使用道具 举报
你的代码可能出现死锁
回复 使用道具 举报
如果不满足你的循环条件,你的线程就没有等待,那么里面flag标志就不会被改变,你的线程就无休止的执行lock(); 和unlock(); 你需要执行的语句就无法被执行到

评分

参与人数 1黑马币 +1 收起 理由
zhoubinjian + 1 很给力!

查看全部评分

回复 使用道具 举报
小白想学javaEE 发表于 2016-4-7 14:16
this.name=name;
                        this.sex=sex;
                       ...

是的,谢谢,这是个错。。
回复 使用道具 举报
伊乐杰 发表于 2016-4-5 22:03
看看是不是没导包

谢谢,是没有导包,自己太粗心啦
回复 使用道具 举报

是没有导包。自己太粗心了
回复 使用道具 举报
导包导包
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马