1

...

Thread showWordThread = new Thread() {
    public void run() {
            try {
                sleep(config.delayTime * 1000);
            } catch (Exception e) {
                System.out.println(e.toString());
            }
            this.run();
        }
    };
    showWordThread.run();
}

...

エラーが発生する前に、約 5 分間実行されていました。

スレッド「Thread-2」での例外 java.lang.StackOverflowError.

なんで?

私はこれを試しました:

Thread showWordThread = new Thread(new Runnable() {
        public void run() {
            while (true) {
                try {
                    Thread.sleep(config.delayTime * 1000);
                } catch (Exception e) {
                    System.out.println(e.toString());
                }
            }
        }
    });
    showWordThread.start();

しかし、それでもエラーが発生しました。

4

6 に答える 6

4

while他の人は、代わりにループを使用する必要があると説明しています。またrun、匿名クラス宣言内でメソッドを呼び出そうとしています。さらに、startではなくを呼び出す必要がありますrun- 新しいスレッドが開始されると、run自動的に呼び出されます。Runnable拡張するのではなく、実際に実装することもお勧めしThreadます。あなたが望んでいるのは:

Thread showWordThread = new Thread(new Runnable() {
    @Override public void run() {
        while (someCondition) {
            try {
                Thread.sleep(config.delayTime * 1000);
                // Presumably do something useful here...
            } catch (Exception e) {
                System.out.println(e.toString());
            }
        }
    }
});
showWordThread.start();

あるいは、Timerまたはの使用を検討してScheduledExecutorServiceください。

于 2012-04-22T12:59:17.527 に答える
2

runメソッドを再帰的に呼び出しています。Java は呼び出し情報 (パラメータなど) をスタック メモリに保持するため、メソッドを再帰的に呼び出しているときにエンド ポイントがない場合、スタック メモリが消費され、StackOverflow例外がスローされます。

を増やしたいと思うかもしれませんHeap SizeJVM、この解決策は問題を解決せず、StackOverflow発生します。

スレッドを継続的に実行したいと思います。次のコードをお勧めします。

Thread showWordThread = new Thread() 
{
    public void run() 
    {
            try 
            {
                sleep(config.delayTime * 1000);
            } 
            catch (Exception e) 
            {
                System.out.println(e.toString());
            }
            // this.run(); this snnipet code  make error
        }
    };
    showWordThread.run();
}
于 2012-04-22T13:10:15.050 に答える
1

コードに無限再帰があるため、コードを次のように変更する必要があります。

    Thread showWordThread = new Thread() {
        public void run() {
            while (true) {
                try {
                    Thread.sleep(config.delayTime * 1000);
                } catch (Exception e) {
                    System.out.println(e.toString());
                }
            }
        }
    };
    showWordThread.start();
于 2012-04-22T12:56:01.057 に答える
1

run() メソッド内から run() を呼び出さないでください。終了条件なしで同じメソッドを再入力し続けるため、スタックオーバーフローが確実に発生します。代わりにwhileループを使用してください。

Thread showWordThread = new Thread() {
    public void run() {
        while(condition) {
            try {
                sleep(config.delayTime * 1000);
            } catch (Exception e) {
                System.out.println(e.toString());
            }
        }
    };
    showWordThread.start();
}
于 2012-04-22T12:57:00.603 に答える
0

関数は、実行するたびに自分自身を呼び出します。
その結果、スタック オーバーフローが発生します。

于 2012-04-22T12:55:04.547 に答える
0

それ自体からrunメソッド ( )を呼び出しているためでしょうか?this.run()

于 2012-04-22T12:55:07.237 に答える