黑马程序员技术交流社区

标题: 多线程问题 [打印本页]

作者: 臧盼    时间: 2012-12-10 20:36
标题: 多线程问题
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,求指点。。。。
作者: 李培根    时间: 2012-12-10 20:41
本帖最后由 李培根 于 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.操作共享数据的线程代码有多条。

作者: 小洋人最happy    时间: 2012-12-10 20:57
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() ;
        }
}
作者: 焦健    时间: 2012-12-10 21:29
你的这种情况是因为当一条线程进入以后,进行循环条件判断,但是还没有输出就被其他线程抢去执行权,从你的程序执行可以看出,打印出来的数值有次序颠倒的情况,可以说明这一点,解决办法是在要同步执行的代码上加一个锁,如下:

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() ;
        }
}

作者: 李培根    时间: 2012-12-11 09:16
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.操作共享数据的线程代码有多条。





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