2011-12-28 11 views
1

現在のスレッドを停止し、run()メソッドを変更してから、そのスレッドを再開しようとしています。私は周りを見回していて、ほとんどのメソッドは非難されています。しかし、interrupt()はそうではありません。それだけでいいのかどうかはわかりません。スレッドを停止して再起動する

interrupt(); 
start(); 

私はそれが必要な作業をしますか?それはあなたが複数回のスレッドを起動することはありません、それはむしろ私がやりたいことよりも

start(); 
start(); 

を意味している場合、私は知らないと言っています。

何か助けていただければ幸いです。 interrupt()を呼び出す

おかげ

+0

実行方法を変更することで何を意味するのか不明です。 sleep()を使用してスレッドを一時停止させることができます。スレッドを停止するには、run()メソッドを終了して終了させるのが最善です。次に、スレッドを使用する場合は、新しいスレッドを作成します。それ以外の場合は、以下のようにエグゼキュータを使用します。 – Davos555

答えて

3

スレッドを再起動しないでください。あなたはいつもこれを行うためにあなたの営業ロジックを書き直すことができます。使用を検討するSingleThreadExecutor

1

は、ブロッキング方法を中断する可能性のスレッドの割り込みステータスを設定します。これは協調的な取り消し機構の一部です。これを使用してスレッドの実行を強制的に停止することはできません。

スレッドを停止するのは、その理由から非難されています。ステート変数が矛盾した状態で処理される可能性があるため、本質的に危険です。

これは行わないでください。 run()メソッドのコードをRunnableにして、実行のためにExecutorに送信してください。これにより、Futureが返されます。これを使用して結果を取得し、キャンセルすることができます。

他の計算に同じスレッドを再利用する場合は、スレッドプールを使用してください(Executors.newFixedThreadPool()などを参照)。その他のファクトリメソッドはExecutorsです。

1

スレッドを開始した後は、スレッドを中断できます。一度やってしまえば、もう一度やり直すことはできません。詳細については、hereを参照してください。

私はあなたが何をしたいのかは分かりませんが、実行したいRunnablesが違うように聞こえます。この場合はSingleThreadExecutorを使用し、Runnablesを提出してください。 の順番で実行するので、最初の(中断)割り込みは2番目の割り込みを呼び出すでしょう。

これは良いアイデア(正しいとは言えません)と、おそらくもっと詳細な問題の説明を投稿することで、あなたが実際にやろうとしていることをよりよく理解できるようになるかどうかはまだ分かりません。

4

いいえ、できません。 Fron the java online docs

スレッドを複数回起動することは決してできません。特に、スレッドが実行を完了すると、スレッドを再起動することはできません。

2

この場合、Runnableオブジェクトを作成してスレッドに渡す必要があります。次に、別のスレッドを作成しますが、 'work'オブジェクトを再利用します。

1

さらにスレッドの基本を調べる必要があります。スレッドは一度しか実行できません。スレッドに異なるコードを実行させたい場合は、新しいスレッドを作成する必要があります。

interrupt()メソッドは、スレッドをすぐに停止させることはありません(サポートされていません)。InterruptedException()をスローすることによって、特定のポイントでのみ停止します。

1

間違った方法で問題に近づいていると思います。あなたは 'スレッドのrun()メソッドを変更することはできません'。しかし、おそらくあなたが望むのは、前のスレッドを停止し、別のrun()メソッドを使って新しいスレッドを作成することです。

ただし、スレッドはできるだけ自律的に設計されているため、他のスレッドからの干渉が気に入らないため、suspend()およびresume()が推奨されていません。状況に応じてあらゆる種類の悪い行動を起こし、デッドロックを起こしやすくなります。

ただし2完全に安全な代替があります。待って()、および特定の共有オブジェクトに()を通知

  1. 使用を。
  2. 利用スリープ()と(インタラプト)

あなたは(実行中に決定する必要があり)それは(「停止」スレッド、およびその時点での待機を置く()またはスリープに安全である方法)。スレッドはその時点で停止します。

他のスレッドは、実行中のスレッドに通知または中断するようにnotify()またはsleep()を実行できます。 interrupt()の場合、InterruptedExceptionが発生し、そのスレッドで行っていた作業を終了することができます。

古いスレッドを中断した後、異なるrun()メソッドを持つ新しいRunnable実装で初期化された新しいスレッドを開始することができます。