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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 臧盼 中级黑马   /  2012-12-10 20:36  /  1259 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class MyThread implements Runnable
{       
        private int num = 0 ;
        public void run(){
                for(int i = 0;i<10;i++){
                        try{
                                Thread.sleep(20) ;
                        }catch(Exception e){}
                                System.out.println(num++) ;       
                }
        }
}

public class RunnableDemo
{
        public static void main(String[] args){
                MyThread mt = new MyThread() ;
                Thread t1 = new Thread(mt) ;
                Thread t2 = new Thread(mt) ;
                Thread t3 = new Thread(mt) ;
                Thread t4 = new Thread(mt) ;

                t1.start() ;
                t2.start() ;
                t3.start() ;
                t4.start() ;
        }
}

为什么运行结果不是1到39,求指点。。。。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 李培根 于 2012-12-11 09:18 编辑

class MyThread implements Runnable
{        
       private int num = 0 ;
        public synchronized void run(){//这里存在线程安全问题,需要加上同步。同步函数或者同步代码块
                for(int i = 0;i<10;i++){
                        try{
                                Thread.sleep(20) ;
                        }catch(Exception e){}
                                System.out.println(num++) ;        
               }
        }
}

public class RunnableDemo
{
        public static void main(String[] args){
                MyThread mt = new MyThread() ;
                Thread t1 = new Thread(mt) ;
                Thread t2 = new Thread(mt) ;
                Thread t3 = new Thread(mt) ;
                Thread t4 = new Thread(mt) ;

                t1.start() ;
                t2.start() ;
                t3.start() ;
                t4.start() ;
        }
}

加上同步后就没有问题了。
线程安全问题产生的原因:
        1.多个线程在操作共享的数据。
        2.操作共享数据的线程代码有多条。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
class MyThread implements Runnable
{        
        private int num = 0 ;
        public void run(){
                while(true){      //此处加上个判断循环条件就可以了
                                for(int i = 0;i<10;i++){
                        try{
                                Thread.sleep(20) ;
                        }catch(Exception e){}
                                System.out.println(num++) ;        
                }
                                }
        }
}

public class  RunnableDemo
{
        public static void main(String[] args){
                MyThread mt = new MyThread() ;
                Thread t1 = new Thread(mt) ;
                Thread t2 = new Thread(mt) ;
                Thread t3 = new Thread(mt) ;
                Thread t4 = new Thread(mt) ;

                t1.start() ;
                t2.start() ;
                t3.start() ;
                t4.start() ;
        }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你的这种情况是因为当一条线程进入以后,进行循环条件判断,但是还没有输出就被其他线程抢去执行权,从你的程序执行可以看出,打印出来的数值有次序颠倒的情况,可以说明这一点,解决办法是在要同步执行的代码上加一个锁,如下:

class MyThread implements Runnable
{        
        private int num = 0 ;
        Object obj =new Object();
        public void run()
        {
                synchronized(obj)
                {
                for(int i = 0;i<10;i++){
                        try{
                                Thread.sleep(20) ;
                            }
                        catch(Exception e)
                        {}
                        System.out.println(Thread.currentThread().getName()+"::"+num++) ;        
                }
            }
        }
}

class RunnableDemo
{
        public static void main(String[] args){
                MyThread mt = new MyThread() ;
                Thread t1 = new Thread(mt) ;
                Thread t2 = new Thread(mt) ;
                Thread t3 = new Thread(mt) ;
                Thread t4 = new Thread(mt) ;

                t1.start() ;
                t2.start() ;
                t3.start() ;
                t4.start() ;
        }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
class MyThread implements Runnable
{        
       private int num = 0 ;
        public synchronized void run(){//这里存在线程安全问题,需要加上同步。同步函数或者同步代码块
                for(int i = 0;i<10;i++){
                        try{
                                Thread.sleep(20) ;
                        }catch(Exception e){}
                                System.out.println(num++) ;        
               }
        }
}

public class RunnableDemo
{
        public static void main(String[] args){
                MyThread mt = new MyThread() ;
                Thread t1 = new Thread(mt) ;
                Thread t2 = new Thread(mt) ;
                Thread t3 = new Thread(mt) ;
                Thread t4 = new Thread(mt) ;

                t1.start() ;
                t2.start() ;
                t3.start() ;
                t4.start() ;
        }
}

加上同步后就没有问题了。
线程安全问题产生的原因:
        1.多个线程在操作共享的数据。
        2.操作共享数据的线程代码有多条。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马