黑马程序员技术交流社区

标题: 哪位大神帮我看下代码 [打印本页]

作者: 笑轻轻    时间: 2014-8-12 21:54
标题: 哪位大神帮我看下代码

public class 线程通信 {
        public static void main(String[]args){
                Rec r=new Rec();
                new Thread( new input(r)).start();
                new Thread( new output(r)).start();
        }
}
class Rec{
        private String name;
        private char sex;
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public char getSex() {
                return sex;
        }
        public void setSex(char sex) {
                this.sex = sex;
        }
        public Rec(){

        }

}
class input implements Runnable{
        private Rec r;
        public input(Rec r){
                this.r=r;
        }
        public void run(){
                int i=0;
                while(i<5000){
                        if(i%2==0){

                                r.setName("张三");
                                r.setSex('男');
                        }
                        else{

                                r.setName("小花");
                                r.setSex('女');
                        }
                        i++;
                }
        }
}
class output implements Runnable{
        private Rec r;
        public output(Rec r){
                this.r=r;
        }
        public void run(){
                for(int i=0;i<5000;i++){
                        System.out.println(r.getName()+"------"+r.getSex());
                }
        }
}//为什么我执行了N遍怎么出现的都是小花-----女 偶尔才只出现一次 小花-----男 根本没看到输出张三-----男。这是为什么啊
作者: 杨庆雷    时间: 2014-8-12 22:14
比如说进入input的线程先执行, r.setName("张三")r.setSex('男');之后,另一个线程执行,然后执行一段时间(output里的i有可能循环结束)然后再去set也没意思了,还有好多种情况 你自己分析分析
作者: fantacyleo    时间: 2014-8-12 22:23
因为运行速度太快,input线程一下就把5000次循环执行完毕才轮到output。。。你试着在input的i++ 和output的println后面各让线程睡上一会就可以看到不同的姓名和性别组合了

作者: dftgg    时间: 2014-8-13 10:19
把要共享的数据加入同步处理 synchrozied
作者: sunshine9091    时间: 2014-8-13 10:26
亲,你要加锁!
作者: 笑轻轻    时间: 2014-8-13 12:28
真是水军滔天啊
作者: 沿途小将    时间: 2014-8-13 13:35
线程同步啊,兄弟!
作者: 落幕繁华    时间: 2014-8-13 16:28
线程安全问题。需要在共享的数据上使用同步来确保一个线程运行,另一个线程等待




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