2

私はstackoverflowに関するいくつかの投稿を見て、オラクルがスレッドの破棄について投稿したチュートリアルを読みました。私が理解していることから、一度スレッドを作成すると、そのスレッドを削除するためにstart()使用することはできません。stop()スケジューラからスレッドを実際に削除するのではなく、スレッドをsleep()無期限に作成することをお勧めします。これは正しい考えですか?

また、これは私の次の質問につながります。これが、人々がthread pools?.スレッドを「スリープ」する代わりに、新しいスレッドを作成するよりも他のジョブで作業するためにそのスレッドを使用する方がリソースが多い理由です。私のmulti-thread経営に対する理解が正しいかどうか教えてください。threadJavaが安全な方法でを完全に削除することを許可しないことは意味がありません。

4

2 に答える 2

3

スレッドは、取得したリソースをクリーンアップできないため、スレッドの開始後に強制的に停止する(または無期限にスリープさせる)ことは、一般的に非常に悪い考えと見なされます。たとえば、スレッドがロックを取得し、強制的に強制終了または無期限にスリープされた場合、ロックは解放されず、デッドロックが発生する可能性があります。同様に、スレッドがデータ構造に変更を加えて早期に強制終了した場合、データ構造が破損した状態になり、後で重大な問題が発生する可能性があります。

Javaでスレッドを停止する最善の方法は、スレッドを中断して、できるだけ早くシャットダウンを試みる必要があることをスレッドに伝えることです。そうすることで、スレッドはシャットダウンする前に、実行中の処理を停止し、リソースを解放しようとすることができます。つまり、スレッドを強制的に強制終了するのではなく、スレッドをシャットダウンするように要求します。

これは、スレッドプールが存在する理由とは関係ありません。スレッドプールは、スレッドの状態と進行状況を追跡するために必要な内部JVMまたはOSレベルの簿記のために、通常、スレッドの作成または破棄に関連するオーバーヘッドがあるため、便利です。スレッドプールを使用すると、スレッドをリサイクルして、タスクの準備ができるまでスレッドをスリープさせてからウェイクアップしてタスクを実行することで、さまざまなタスクを実行させることができます。これは、新しいスレッドを生成し、自分でタスクを実行してからスレッドを破棄するよりもはるかに高速です。

お役に立てれば!

于 2013-01-11T05:04:17.367 に答える
1

templatetypedefが述べたように、スレッドを強制的に停止するのではなく、スレッドに停止するように通知する必要があります。たとえば、スレッドがブロックしているときはいつでも、ブロックしている条件と終了する条件をテストするwhileループで実行する必要があります。

while (!condition && !stop) {
    try {
        someBlockingFunction(); // A lock, take on a BlockingQueue, etc.
    } catch (InterruptedException e) { //ignored }
}

stop = truewhileループを終了したら、別のスレッドによって停止()されるように通知されているかどうかを確認します。停止している場合は、run()関数から戻ってスレッドがクリーンアップできるようにします。

于 2013-01-11T05:15:51.747 に答える