2015-12-17 4 views
5

は、私の質問は:私は、このボタンを数回クリックします。 「I'm in thread」というメッセージが印刷された後に、まだいくつかのスレッドが存在していますか?または、実行機能が終了するたびに、スレッドは破棄されますか?新しいスレッドを複数回

同時に実行されている複数のスレッドを作成する場合、どのようにしてそれらをきれいに閉じることができますか?

ありがとうございました!

+0

新しいスレッドを手動で作成するのではなく、ExecutorServiceを使うべきだと思います。 –

答えて

8

"I'm in thread"というメッセージがまだ印刷されていない場合、まだいくつかのスレッドが存在しますか? ?

いいえ、それぞれ自動的に破棄されます。

同時に実行されている複数のスレッドを作成する場合は、 どうすればそれらをきれいに閉じることができますか?彼らは彼らのタスク(実行の実行)を終えた後

スレッドを停止する必要はありませんが、彼らは自動的に破棄されます。

並行性と安全性を処理するには、javaの並行性を処理するためのユーティリティフレームワークであるjava.util.concurrentを参照してください。

+1

そして、javaは別のスレッドを止める手段を提供しません。 – VicX

+1

あなたの答えをありがとう。あなたは私に別の解決策を与えるのではなく、直接私の質問に答える唯一の人です! – Stochelo

1

スレッドを毎回作成することは、スレッドプールを使用すると悪い考えです。

0

匿名のRunnableオブジェクトを作成likeSinceあなたのように多くのスレッドを作成し、実行可能なオブジェクトを渡す...代わりに匿名スレッドのRunnableをを実装するクラスを作成するには、あなたの要件を達成するためにあなたを制限するため、1つのオブジェクトのみを作成します。別のスレッドを作成する前にスレッドの状態をチェックするか、スレッドグループ(償却)を作成するか、runnableではなくcallableを使用して同時スレッドを使用してスレッドプールを作成し、スレッドプールに渡すか、runnableをcallableに変換してプール

class Thop implements Runnable 
{ 
     public void run() 
     { 
        // operation 
     } 
} 
+0

あなたの答えをありがとう! – Stochelo

2

好きなだけ時間がメッセージ「私はスレッドにいるよ」がプリントされた後も、既存のいくつかのスレッドはありますか?または、実行機能が終了するたびに、スレッドは破棄されますか?

ボタンクリックごとにスレッドが作成されるため、多くのスレッドを作成しています。

スレッドの寿命はrun()方法の最後のステートメントが完了した後に終わりました。 run()メソッドの実行後、スレッドはTERMINATEDStateに入り、再実行することはできません。

すべてのボタンをクリックするたびに新しいスレッドが作成されるわけではありません。アプリケーションでさらにスレッドが必要な場合は、スレッドのプールを探してください。

Javaは、この目的のためにExecutorフレームワークを提供します。スレッドライフサイクルをより良い方法で管理します。

例えばExecutorService

Executorsから返されます使用API​​のいずれか、 newFixedThreadPool(4)

このpostとこのarticleをご覧ください。

同時に実行されている複数のスレッドを作成する場合は、どのようにしてそれらをきれいに閉じることができますか?

することはできシャットダウンSEポストの下で引用さExecutorServiceとして:HandlerThread

Handlerを参照してください:あなたは、Androidを使用しているので

How to properly shutdown java ExecutorService

、あなたはマルチスレッドのためのもう一つの良い代替を持っています詳細については、ポストより下に:

Android: Toast in a thread

+0

これは質問に答えず、最高でもコメントです。 – John

+0

詳細を追加しました。 –

+1

スレッドに「破棄される」と付け加えるなら、その理由を言及するかもしれません。 Termination _allows_破棄するスレッドですが、破棄するスレッドは_cause_しません。 'Thread'オブジェクトは他のオブジェクトが破壊されたのと同じ理由で破棄されます:GCはライブ参照がないときにそれを再利用します。 'Thread'オブジェクトにとって特別なのは、スレッドが実行されている限り、JVM実装コードの中にライブ参照が存在することだけです。 –

関連する問題