~~> WAY 1
あなたがあなた自身のBlockingQueue
read this is very usefulを実装またはJavaからのデフォルトの実装を使用することができますライブラリtutorial
は、したがって、上記のリンクを読んだ後、あなたは
ようなあなたのクラスにメソッドを追加します3210
第二に、あなたがキューが空の場合、それはあなたが法に
queue.take();
を呼び出し、このスレッドは、新しいオブジェクトが追加されるまで、あなたので、待ってブロックされているloop.Insideながら無限に実行されているスレッドを実装CPU使用時間を心配する必要はありません。
最後に上限を設定することができます。たとえば、キューには27個の項目が含まれます。
スレッド障害の場合、手動で再作成する必要があることに注意してください。
~~> WAY 2より良いアプローチ
あなたはエグゼキューインターフェイスを使用することができます。
ExecutorService executorService1 = Executors.newSingleThreadExecutor();
ドキュメントから:
は、単一の労働者を使用するエグゼキュータを作成します。スレッドは無制限のキュー で動作します。ただし、シャットダウン前に実行中に障害が発生したためにこの単一スレッドが終了すると、 が終了すると、新しいスレッドが実行され、後続のタスクを実行する必要がある場合は になります)。 タスクは、任意の時点で有効になります です。
以下の方法では、ジョブが正常に完了した場合に結果を取得します。
Future future = executorService.submit(new Callable(){ public Object call() throws Exception { System.out.println("Asynchronous Callable"); return "Callable Result"; } });
System.out.println("future.get() = " + future.get());
future.get()がnullを返した場合、ジョブは正常に終了しました。
executorService.shutdown();
このExecutorService内のアクティブなスレッドがJVMのシャットダウンを妨げる可能性があるため、 executorService.shutdown();
と覚えておいてください。あなたのコードでも同じ状態にアクセスしようとする複数のスレッドに苦しむ離れて、プリンタに複数の印刷ジョブを送るの問題から、
全チュートリアルhere
注意。 'setPrintContent(pt)'を呼び出すことによって、 'print(...) 'を呼び出すたびに' printContent'を別の値に設定します。あなたが作成したスレッドは、将来、ある(未確定の)ポイントでその値にアクセスしようとします。バックグラウンドスレッドに正しい印刷内容が表示されるという保証はありません。 –
あなたは絶対に正しいです。非常に短時間で連続して2つ以上の印刷ジョブを送信すると、特に例外が発生します。 – Chiggiddi
例外が発生しないので、間違ったものが印刷されるだけです。例外はあなたがすでに特定した問題のものです。 –