java多线程问题,请教大神,多谢

class Res
{
String name;
String sex;
}
class Input implements Runnable
{
private Res r;//这句是什么意思?跟Res r = new Res();有什么区别?
Input(Res r)
{
this.r=r;
}
public void run()
{
int x = 0;
while(true)
{
if(x==0)
{
r.name="mike";
r.sex="man";
}
else
{
r.name="丽丽";
r.sex="女女";
}
x=(x+1)%2;
}
}
}
class Output implements Runnable
{
private Res r;
Output(Res r)
{
this.r=r;
}
public void run()
{
while(true)
{
System.out.println(r.name+"-------"+r.sex);
}
}
}
class InputOutputDemo
{
public static void main(String[] args)
{
Res r=new Res();
Input in=new Input(r);
Output out=new Output(r);
Thread t1=new Thread(in);
Thread t2=new Thread(out);
t1.start();
t2.start();
}
}
执行结果是什么?为什么是那样?
线程t2输出的为什么是t1处理后的r?

3个回答

private Res r;//这是在类中定义类的成员变量,而没有赋初始值,而你后面那句是对成员变量初始化。如果写成下面:

 private Res  r = new Res();

也是定义成员变量,但是定义的时候就给赋值了初值了。
你这段代码执行while(true)中没有break,所以是死循环,交替输出:

 mike-------man
mike-------女女
丽丽-------女女
丽丽-------女女
丽丽-------man
mike-------man
mike-------女女
mike-------man
丽丽-------man
mike-------女女
ChenZhK
ChenZhK 线程t2输出的为什么是t1处理后的r?
3 年多之前 回复

没有new的话就只是赋予了类型。虽然不报错,也即是没有编译时异常,但是一旦就这么运行了,就会出现nopointerexception异常。就是运行时异常。一般来说我们会先声明变量,然后在合适的地方初始化变量,保证程序的健壮性。希望对你有用图片说明

private Res r;//这句是什么意思?跟Res r = new Res();有什么区别?

上面那个是类中成员变量,Input作为参数传人.
以下是main中代码
Res r=new Res();//在这里创建实例
Input in=new Input(r);//传人对象
Output out=new Output(r);//传入对象

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!