3

スレッドを再開しようとすると、次のエラーが発生しました。

Exception in thread "Thread-1" java.lang.IllegalThreadStateException
     at java.lang.Thread.start(Unknown Source)
     at com.jrat.server.Server.run(Server.java:159)

ここに行があります:

if (!t.isAlive()) t.start();

コードはループ(ソケットハンドラ)内にあるため、何度でも実行できます。私の知る限り、このエラーは、既に実行されているため、新しいスレッドを開始できないことを意味します。奇妙なのは、以前に isAlive を持っていることです。

なぜそれがそのようなものなのか、何か考えはありますか?

ありがとう。

4

5 に答える 5

8

私の知る限り、このエラーは、既に実行されているため、新しいスレッドを開始できないことを意味します。

いいえ、すでに開始されているスレッドを開始することはできません。

あなたがやろうとしているスレッドを再開することはできません。のドキュメントstart()から:

例外: IllegalThreadStateException - スレッドがすでに開始されている場合。

推測では、おそらくExecutorService代わりに an を使用する必要がありますが、何をしようとしているのかは明確ではありません。

于 2012-04-18T10:20:52.263 に答える
2

以前に開始されたスレッドで start を呼び出すことはできません。スレッド実行メソッドが終了した場合でも。

于 2012-04-18T10:22:39.177 に答える
1

あなたが達成しようとしているのは、スレッドが生きていない場合は、それを開始することです。しかし、それは概念的に間違っています。

スレッドが生きていなくても、start メソッドを呼び出すことはできません。一度起動すると、実行が完了しても再度起動することはできません。

タスクを再実行する場合は、ExecutorService を試すことができます。

于 2012-04-18T11:49:48.407 に答える
1

Vodemki さん、タスクがあるたびに新しいスレッドを作成するのはコストがかかります。スレッド プールを使用する必要があります。基本的には、n 個のスレッドのプールがあり、そこにタスクを送信します。一部のスレッドが空いている場合は、タスクを実行します。一部のスレッドがそのタスクを完了すると、プールに戻り、他のタスクを待機します。

スレッドのプーリングに ExecutorService を使用してみてください。

于 2012-04-18T12:20:01.123 に答える
0

私は最も簡単な方法を見つけました:

新しいスレッドを開始する必要があるたびに、新しいスレッドを作成します。

Thread t = new Thread()
{
    public void run()
    {
        // Do your deal here
    }
};
t.start();
于 2012-04-18T12:12:59.440 に答える