黑马程序员技术交流社区

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

作者: 康大玮    时间: 2012-5-24 13:01
标题: 关于多线程的问题
package cn.itcast;


import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class ThreadScopeShareData2 {

        private static int data = 0;
        public static void main(String[] args) {
                for(int i=0;i<2;i++){
                        new Thread(new Runnable(){
                                @Override
                                public void run() {
                                         data = new Random().nextInt();
                                        System.out.println(Thread.currentThread().getName()
                                                        + " has put data :" + data);
                                        new A().get();
                                        new B().get();
                                }
                        }).start();
                }
        }
       
        static class A{
                public void get(){
                        System.out.println("A from " + Thread.currentThread().getName()
                                        + " get data :" + data);
                }
        }
       
        static class B{
                public void get(){               
                        System.out.println("B from " + Thread.currentThread().getName()
                                        + " get data :" + data);
                }               
        }
}

为什么会出现这样的结果:
Thread-0 has put data :1647591390
A from Thread-0 get data :-266051942
B from Thread-0 get data :-266051942
Thread-1 has put data :-266051942
A from Thread-1 get data :-266051942
B from Thread-1 get data :-266051942
作者: 袁培育    时间: 2012-5-26 10:51
线程不同步问题,在用多线程时经常碰到,你可以多次运行试试每次结果不一定一样(不仅仅是数字不一样,你时候死就知道了)。就这次的结果给你分析一下。你主函数运行时for循环开启一个线程Thread-0并获得一个随机数1647591390,并输出Thread-0 has put data :1647591390,这时Thread-0失去执行权,主线程执行第二次for循环,又开启一个线程Thread-1获得一个随机数,注意因为data时静态的所以这时的data是由Thread-1随机出来的即-266051942,这时Thread-0获得执行权,输出A from Thread-0 get data :-266051942   B from Thread-0 get data :-266051942;然后Thread-1获得执行权输出A from Thread-0 get data :-266051942 B from Thread-0 get data :-266051942,于是就得到你所得的结果。
作者: 张晨    时间: 2012-5-26 13:03
两个线程操作同一个变量肯定是需要同步的
一个线程必须同时完成put get get操作,否则第二个线程put只有 第一个线程get的就是第二个线程产生的随机数,显然你不愿意出现这种结果

作者: 乔建国    时间: 2012-5-26 14:07

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class ThreadScopeShareData2 {

        private static int data = 0;
         public static void main(String[] args) {
                 for(int i=0;i<2;i++){                //这里控制启动两条线程
                         new Thread(new Runnable(){    //创建Thread类对象, 将Runnable对象传入Thread的构造函数中
                                 @Override
                                 public void run() {
                                          data = new Random().nextInt();  //伪随机地生成并返回一个 int 值
                                         System.out.println(Thread.currentThread().getName()   //获取线程名称
                                                        + " has put data :" + data);
                                         new A().get();   // 通过对象调用A类中的get()方法;
                                         new B().get();    // 通过对象调用B类中的get()方法;
                                 }
                         }).start();       //调用Thread对象的start()方法就可以开启一条新线程, 新线程中执行Runnable的run()方法
                 }
         }
         
        static class A{     //创建静态内部类A
                 public void get(){
                         System.out.println("A from " + Thread.currentThread().getName()
                                        + " get data :" + data);
                 }
         }
         
        static class B{    //创建静态内部类B
                 public void get(){               
                        System.out.println("B from " + Thread.currentThread().getName()
                                        + " get data :" + data);
                 }               
        }
}





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