public class MyJava{
    public static void main(String[] args){
    String[] strs=new String[2];
        MyThread_A t1=new MyThread_A(strs);
        MyThread_B t2=new MyThread_B(strs);
        t1.start();
        t2.start();
        for(String s:strs) System.out.println(s);        //打印每个线程收集的数据
    }
}class MyThread_A extends Thread{
    String[] strs;
    public MyThread_A(String[] strs){
        this.strs=strs;
    }
    public void run(){
        String s=null;        //计算机strs[0]的值
        s="a";
        strs[0]=s;
    }
}class MyThread_B extends Thread{
    String[] strs;
    public MyThread_B(String[] strs){
        this.strs=strs;
    }
    public void run(){
        String s=null;
        s="b";            //计算机strs[1]的值
        strs[1]=s;
    }
}

解决方案 »

  1.   

    变量值传递方式的不对,
    你的只是对局部变量的值进行了修改。java是值传递,所以你传的strs在线程中只是对该strs的值的引用,但是并不能改变strs中的值。
      

  2.   

    #1不是正解.是线程同步的问题,这样改改,同步一下就可以了public class MyJava{
        public static void main(String[] args)throws InterruptedException{
        String[] strs=new String[2];
            MyThread_A t1=new MyThread_A(strs);
            MyThread_B t2=new MyThread_B(strs);
            t1.start();
            t1.join();
            t2.start();
            t2.join();
            for(String s:strs) System.out.println(s);        //打印每个线程收集的数据
        }
    }class MyThread_A extends Thread{
        String[] strs;
        public MyThread_A(String[] strs){
            this.strs=strs;
        }
        public void run(){
            String s=null;        //计算机strs[0]的值
            s="a";
            strs[0]=s;
        }
    }class MyThread_B extends Thread{
        String[] strs;
        public MyThread_B(String[] strs){
            this.strs=strs;
        }
        public void run(){
            String s=null;
            s="b";            //计算机strs[1]的值
            strs[1]=s;
        }
    }不过这样就不是多线程了,等于单线程,不过可以得到你想要的结果.
      

  3.   

    补充一下,楼主的程序,输出结果是不稳定的,可能的结果:1. null
       null2. a
       null3. null
       b
      

  4.   

    4楼正解,因为你的main方法也是一个线程,线程是抢占式的。所以4楼正解,String和基本数据类型是传值调用的,而其他引用类型是传本身引用调用。数组时传本身引用调用的。LZ基本功不扎实。
      

  5.   

    以前我也碰到过类似的问题,我找出的原因是:线程还没开始执行,main线程就已经结束,这样的话,其他线程还没执行就over了。我的解决方案是:在调用t2.start(); 后插入一句Thread.sleep(5000),让主线程sleep几秒。
      

  6.   

    我运行了几次都是
    a
    b怎会还出现null呢?能说得详细一点吗
      

  7.   

    你现在再run几次,还是只有a和b么?
      

  8.   

    结果不稳定,因为连上main方法,程序总共有三个线程在执行,出现
    null
    null
    是因为当你第一个线程和第二个线程执行的同时,主线程也在同步执行,自定义的两个线程还没有执行完毕,已经执行了打印语句,结果当然是空。