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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 笑轻轻 中级黑马   /  2014-8-12 21:54  /  1865 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


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遍怎么出现的都是小花-----女 偶尔才只出现一次 小花-----男 根本没看到输出张三-----男。这是为什么啊

9 个回复

倒序浏览
比如说进入input的线程先执行, r.setName("张三")r.setSex('男');之后,另一个线程执行,然后执行一段时间(output里的i有可能循环结束)然后再去set也没意思了,还有好多种情况 你自己分析分析
回复 使用道具 举报
因为运行速度太快,input线程一下就把5000次循环执行完毕才轮到output。。。你试着在input的i++ 和output的println后面各让线程睡上一会就可以看到不同的姓名和性别组合了

点评

你说反了。楼主的问题恰恰来自JVM的线程调度。而我则是让楼主对JVM的调度进行调控  发表于 2014-8-13 13:53
你说的这个问题,是jvm控制的,而楼主是需要程序员自己可以控制  发表于 2014-8-13 13:37
回复 使用道具 举报 0 1
把要共享的数据加入同步处理 synchrozied
回复 使用道具 举报
亲,你要加锁!
回复 使用道具 举报
真是水军滔天啊
回复 使用道具 举报
线程同步啊,兄弟!
回复 使用道具 举报
线程安全问题。需要在共享的数据上使用同步来确保一个线程运行,另一个线程等待
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马