黑马程序员技术交流社区

标题: 线程等待唤醒问题 [打印本页]

作者: linder_qzy    时间: 2015-3-11 11:05
标题: 线程等待唤醒问题
有个程序执行后不是想要的结果。想要2个线程交替运行,结果却是无序的执行,帮忙看看哪里出了问题
class Resource
{
        String name;
        String sex;
        boolean flag = false;
}

class InPut implements Runnable
{
        Resource res;
        InPut(Resource res)
        {
                this.res = res;
        }
        public void run()
        {
                int x = 0;
                while(true)
                {
                        synchronized(res)
                        {
                                if(res.flag)
                                        try
                                        {
                                                res.wait();
                                        }
                                        catch (Exception e)
                                        {
                                        }       
                               
                                if(x==0)
                                {
                                        res.name = "老王";
                                        res.sex = "男";
                                }
                                else
                                {
                                        res.name = "小张";
                                        res.sex = "女";
                                }
                                x=(x+1)%2;
                                res.flag = true;
                                res.notify();
                        }
                }
        }
}
class OutPut implements Runnable
{
        Resource res;
        OutPut(Resource res)
        {
                this.res = res;
        }
        public void run()
        {
                while(true)
                {
                        synchronized(res)
                        {
                                if(!res.flag)
                                        try
                                        {
                                                this.wait();
                                        }
                                        catch (Exception e)
                                        {
                                        }       
                                System.out.println(res.name+"----->"+res.sex);
                                res.flag = false;
                                res.notify();
                        }
                }
        }
}
class InOutWaitNotifyDemo
{
        public static void main(String[] args)
        {
                Resource res = new Resource();
                InPut in = new InPut(res);
                OutPut out = new OutPut(res);
                Thread t1 = new Thread(in);
                Thread t2 = new Thread(out);
                t1.start();
                t2.start();
        }
}
/*运行结果
* 小张----->女
老王----->男
小张----->女
小张----->女
老王----->男
小张----->女
老王----->男
老王----->男
小张----->女
。。。
* */
作者: 杨强彪    时间: 2015-3-11 12:18
file:///C:\Documents and Settings\杨强彪\Application Data\Tencent\Users\843568639\QQ\WinTemp\RichOle\RYDOTAI13~`M6MNZ25{L~UI.png你加两个睡眠机制  一个1000毫秒  一个500毫秒试试 错开时间

RYDOTAI13~`M6MNZ25{L~UI.png (3.05 KB, 下载次数: 2)

RYDOTAI13~`M6MNZ25{L~UI.png





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2