为什么这个java程序构造函数不能无限地继续下去?

时间:2010-01-12 18:31:45

标签: java multithreading

查看一些代码,learing about threads

import java.applet.*;
import java.awt.*;

public class CounterThread extends Applet implements Runnable
{ 
 Thread t; 
 int Count;

 public void init() 
 { 
  Count=0;
  t=new Thread(this);
  t.start();
 }

 public boolean mouseDown(Event e,int x, int y)
 { 
  t.stop();
  return true;
 }

 public void run()
 {
  while(true)
  {
   Count++;
   repaint();
   try {
    t.sleep(10);
   } catch (InterruptedException e) {}
  }
 }

 public void paint(Graphics g)
 {
  g.drawString(Integer.toString(Count),10,10);
  System.out.println("Count= "+Count);
 }

 public void stop()
 {
  t.stop();
 }
}

在构造函数中:

public void init()  {   
    Count=0;
    t=new Thread(this);
    t.start();
}

为什么这个构造函数不会无限期地继续下去?它看起来像是inits,开始一个新的线程传递自己再次调用构造函数(我想),它创建了一个新的线程等。

我错过了一些有趣的东西。感谢您的帮助

抱歉,我无法使代码看起来正确。出于某种原因,当我将行粘贴到顶部时,不要进入代码解析器。

编辑:谢谢你的回答。为了争论,为了使它成为无限循环,你可以添加它:

t=new Thread(new CounterThread());

6 个答案:

答案 0 :(得分:6)

this的传递不会调用构造函数,而是传递引用。它是对您正在创建的CounterThread实例的引用。

答案 1 :(得分:3)

this不是init方法,它是由该方法初始化的类实例(=对象)。

因此不再隐式调用构造函数。

线程在启动时执行run()方法。

答案 2 :(得分:1)

当新线程启动时,它不会调用构造函数,它会调用run()。所以这里没有无限循环。

答案 3 :(得分:0)

传递this时,不会再次调用构造函数。

答案 4 :(得分:0)

您的构造函数不会永远循环,因为t.start();会立即返回。 run()方法的主体在不同的线程中运行。

编辑:看起来没有像其他人提到的那样涉及构造函数。但这种逻辑仍然适用。

答案 5 :(得分:0)

由于其他人都已经覆盖了新的线程(这个)位,我将解决另一方。

启动applet时,这是applet容器执行的伪代码:

Applet applet = new CounterThread();
applet.init();
applet.start();

由于CounterThread没有构造函数,因此Java会创建一个空的默认构造函数。