Java 为什么可以';我不能用类的实例创建一个新线程吗?

Java 为什么可以';我不能用类的实例创建一个新线程吗?,java,multithreading,nullpointerexception,applet,Java,Multithreading,Nullpointerexception,Applet,我想知道为什么以下代码不起作用: public class ClockRunnable extends Applet implements Runnable { Thread m_zeit; Thread m_background; public void init() { m_zeit = new Thread(new ClockRunnable()); m_background = new Thread(new Background()); m_zeit.st

我想知道为什么以下代码不起作用:

public class ClockRunnable extends Applet implements Runnable {

Thread m_zeit;
Thread m_background;

 public void init() {
    m_zeit = new Thread(new ClockRunnable());
    m_background = new Thread(new Background());

    m_zeit.start();
    m_background.start();

  }
}
这当然只是一个示例代码。我想知道,如果我创建一个新的背景线程,它的工作原理与上面所写的一样。但是如果我为我的ClockRunnable类调用一个新线程,它会抛出一个NullPointerExecOption。 但是如果我将新线程命令更改为

        m_zeit = new Thread(this);
它工作得很好

如果上面的例子还不够,下面是整个代码+错误输出:

import java.util.*;
import java.text.*;
import java.awt.*;
import java.applet.*;

public class UhrzeitRunnable extends Applet implements Runnable {
String m_aktZeit;
DateFormat m_formatierer;
Font m_anzeigeFont;
Color m_farbe;
Thread m_zeit;
Thread m_background;

public void init() {
    m_anzeigeFont = new Font("Serif",Font.BOLD,22);
    m_formatierer = DateFormat.getTimeInstance();
    m_aktZeit = m_formatierer.format(new Date());
    m_zeit = new Thread(new UhrzeitRunnable());   // if I change it to "this" it works
    m_background = new Thread(new Background());
    m_zeit.start();
    m_background.start();

}

public void run() {
    while(true) {
        m_aktZeit = m_formatierer.format(new Date());  //NullPointerExeption on this line
        repaint();
        try {
            Thread.sleep(1000); 
        } catch (InterruptedException e) {
            return;
        }
    }
}

public void start() {
    if(m_zeit == null) {
        m_zeit = new Thread(new UhrzeitRunnable());
        m_zeit.start();
    }
    if (m_background==null) {
        m_background = new Thread(new Background());
        m_background.start();
    }
}

public void stop() {
    if(m_zeit!=null){
        m_zeit.interrupt();
        m_zeit = null;
    }
}

public void destroy() {
    if(m_zeit !=null) {
        m_zeit.interrupt();
        m_zeit = null;
    }
}

public void paint(Graphics g) {
    g.setFont(m_anzeigeFont);
    g.setColor(Color.blue);
    this.setBackground(m_farbe);
    g.drawString(m_aktZeit, 20, 45);
}


public class Background implements Runnable {
public void run() {
    while (true) {
        m_farbe = new Color((int) (255*Math.random()),(int) (255*Math.random()), (int)(255*Math.random()));
            repaint();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {

        }
    }
}
}
}
以及错误输出。顺便说一下,背景线程工作得很好

Exception in thread "Thread-3" java.lang.NullPointerException
at kapitel15.UhrzeitRunnable.run(UhrzeitRunnable.java:29)
at java.lang.Thread.run(Unknown Source)

小程序是奇怪的野兽,在小程序上调用构造函数是非常不寻常的。通常这是由网页的Java小程序驱动程序完成的,该驱动程序随后调用小程序的init方法。当您调用构造函数时,不会调用init(),从而使一些键字段为空。但你为什么要这么做?您创建的小程序是一个与正在显示的小程序完全不同的对象,其状态的更改不会反映在显示的对象中。

小程序是奇怪的野兽,对一个小程序调用构造函数是非常不寻常的。通常这是由网页的小程序驱动程序(不管它叫什么)完成的。当您调用构造函数时,不会调用init(),会留下一些空字段。谢谢!如果你把这个答案作为官方答案,我会立即将它标记为我接受的答案!这正是我需要的答案。