-3

出力が複数のスレッドによって処理される関数があります (関数呼び出しが発生した後に作成されます)。しかし、プログラムを実行すると、関数の実行が完了する前に、スレッドから NullPointerException を受け取ります。Java がスレッドを早期に開始しないように指定するにはどうすればよいですか?

public class MainThread extends Thread {
    public MainClass() {
    ...
    myRunnable1 = new myRunnable(args[]);
    myRunnable2 = new myRunnable(args[]);
    ...
    }
    public void run() {
        for (someNumberOfRuns) {
            function1();
            System.out.println("Done");
            thread1 = new Thread(myRunnable);
            thread2 = new Thread(myRunnable);
            thread1.start();
            thread2.start();
            ...
        }
     }
}

for ループの最初の反復で、thread1 と thread2 の両方が NullPointException エラーをスローし、システムは "Done" を出力します。メソッドでそれぞれの start() 呼び出しの前に 2 つのスレッドが開始する理由を知っている人はいますか? ありがとう。(Java のバージョンは 1.6u26)

4

2 に答える 2

1

メソッドでそれぞれの start() 呼び出しの前に 2 つのスレッドが開始する理由を知っている人はいますか?

これは Java では発生しません。スレッドが開始されている場合は、何らかのコードがスレッドを開始しています。run()インスタンス化するスレッドでメソッドを直接呼び出しているか、予期しない場所でMainThread呼び出していると思われます。start()

デバッガーを使用し、メソッドにブレークポイントを配置して、run()誰が呼び出しているかを確認すると役立つ場合があります。デバッグを使用printlnする場合は、内部のスタック トレースを示す例外を出力できますrun()

new Throwable().printStackTrace();

を実際にインスタンス化するコードを提供しMainThreadていただければ、さらにお役に立てる可能性があります。

于 2013-09-26T20:30:02.203 に答える