多线程的一点小问题!!

zhangye0807 2009-10-12 02:35:32
(1)(2)这两个地方写成 Person p = new Person() ;和Student s = new Person() ;就出Exception in thread "main" java.lang.StackOverflowError,为什么??

public class Runnable_Test {

public static void main(String[] arg) {

Person p1 = new Person() ;
Student s1 = new Student() ;
Thread thread = new Thread(p1) ;
thread.start() ;
Thread thread1 = new Thread(s1) ;
thread1.start() ;
}
}

class Person implements Runnable {

private String names ;

Person p = null ; //**************************(1)

public void run() {

p = new Person();

for(int i=0; i<100; i++) {

p.setNames("Person" + i) ;
System.out.println("PersonName---->" + p.getNames()) ;
}
}

public void setNames(String names) {

this.names = names ;
}

public String getNames() {

return this.names ;
}
}

class Student extends Person implements Runnable {

private int age ;

Student s = null ; //**************************************(2)

public void run() {

s = new Student() ;

for(int i=0; i<100; i++) {

s.setNames("Student:" + i) ;
s.setAge(i) ;
System.out.println("StudentName~~~~" + s.getNames());
System.out.println("StudentAge*******" + s.getAge());
}
}

public void setAge(int age) {

this.age = age ;
}

public int getAge() {

return this.age ;
}
}
...全文
78 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
windforcecn 2009-10-12
  • 打赏
  • 举报
回复
你的person本身就是线程类

如果在变量里实例化,就会不断的生成person对象

student也一样

当然会内存溢出
liwenso 2009-10-12
  • 打赏
  • 举报
回复
Person p = new Person(); **A1 //**************************(1)

public void run() {

p = new Person(); **A2


一旦线程run起来之后,A2部分就会运行,A2的运行将导致一个person的实例化,person的实例化要经过A1并且运行它.A1被运行后也会造成一个person实例化的过程,这样就等于一直在实例化,所以stack overflow了.





至少看起来是这样的.

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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