为什么输出都是null?

dlgz888 2009-09-25 10:43:34
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;
}
}
...全文
241 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxxzhy 2009-09-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 q19665444 的回复:]
2楼说的很对

[/Quote]
唉...........
zh286091487 2009-09-30
  • 打赏
  • 举报
回复
以前我也碰到过类似的问题,我找出的原因是:线程还没开始执行,main线程就已经结束,这样的话,其他线程还没执行就over了。我的解决方案是:在调用t2.start(); 后插入一句Thread.sleep(5000),让主线程sleep几秒。
zlllyk110 2009-09-30
  • 打赏
  • 举报
回复
4楼正解,因为你的main方法也是一个线程,线程是抢占式的。所以4楼正解,String和基本数据类型是传值调用的,而其他引用类型是传本身引用调用。数组时传本身引用调用的。

LZ基本功不扎实。
q19665444 2009-09-30
  • 打赏
  • 举报
回复
2楼说的很对
spwwzh 2009-09-30
  • 打赏
  • 举报
回复
结果不稳定,因为连上main方法,程序总共有三个线程在执行,出现
null
null
是因为当你第一个线程和第二个线程执行的同时,主线程也在同步执行,自定义的两个线程还没有执行完毕,已经执行了打印语句,结果当然是空。
superliubao 2009-09-30
  • 打赏
  • 举报
回复
学习了。。。
lxxzhy 2009-09-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qq366727679 的回复:]
引用 11 楼 lxxzhy 的回复:
引用 10 楼 qq366727679 的回复:
引用 5 楼 lxxzhy 的回复:
补充一下,楼主的程序,输出结果是不稳定的,可能的结果:

1. null
  null

2. a
  null

3. null
  b


我运行了几次都是
a
b

怎会还出现null呢?能说得详细一点吗


你是说楼主的程序还是我#4的?
我#4的是稳定输出a和b,楼主的就不稳定,4种可能都会发生,多运行几次就能看到.


说的是你的,明白了
[/Quote]
你现在再run几次,还是只有a和b么?
qq366727679 2009-09-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lxxzhy 的回复:]
引用 10 楼 qq366727679 的回复:
引用 5 楼 lxxzhy 的回复:
补充一下,楼主的程序,输出结果是不稳定的,可能的结果:

1. null
  null

2. a
  null

3. null
  b


我运行了几次都是
a
b

怎会还出现null呢?能说得详细一点吗



你是说楼主的程序还是我#4的?
我#4的是稳定输出a和b,楼主的就不稳定,4种可能都会发生,多运行几次就能看到.
[/Quote]

说的是你的,明白了
lxxzhy 2009-09-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qq366727679 的回复:]
引用 5 楼 lxxzhy 的回复:
补充一下,楼主的程序,输出结果是不稳定的,可能的结果:

1. null
  null

2. a
  null

3. null
  b



我运行了几次都是
a
b

怎会还出现null呢?能说得详细一点吗


[/Quote]
你是说楼主的程序还是我#4的?
我#4的是稳定输出a和b,楼主的就不稳定,4种可能都会发生,多运行几次就能看到.
qq366727679 2009-09-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lxxzhy 的回复:]
补充一下,楼主的程序,输出结果是不稳定的,可能的结果:

1. null
  null

2. a
  null

3. null
  b
[/Quote]


我运行了几次都是
a
b

怎会还出现null呢?能说得详细一点吗

LBreathy 2009-09-30
  • 打赏
  • 举报
回复
这个和传值没有关系,数组是传本身的......所以4楼正解
justinavril 2009-09-27
  • 打赏
  • 举报
回复
楼上回答的很清楚了
hardycheng 2009-09-27
  • 打赏
  • 举报
回复
变量值传递方式的不对,
你的只是对局部变量的值进行了修改。

java是值传递,所以你传的strs在线程中只是对该strs的值的引用,但是并不能改变strs中的值。

lxxzhy 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lxxzhy 的回复:]
补充一下,楼主的程序,输出结果是不稳定的,可能的结果:

1. null
  null

2. a
  null

3. null
  b
[/Quote]
漏了一个

4. a
b
lxxzhy 2009-09-27
  • 打赏
  • 举报
回复
补充一下,楼主的程序,输出结果是不稳定的,可能的结果:

1. null
null

2. a
null

3. null
b
lxxzhy 2009-09-27
  • 打赏
  • 举报
回复
#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;
}
}

不过这样就不是多线程了,等于单线程,不过可以得到你想要的结果.
果壳 2009-09-27
  • 打赏
  • 举报
回复
2楼正解

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧