2009-07-06 2 views
0

私は、出力ストリーム(私の場合はtcp/ipを使用しています)を経由して出て行くデータがブロックされる可能性があると言われました。その場合、データが消えるのを待つことでアプリケーションを停止したくないです。java送信者スレッドを行う方法

私はこれを行う方法のモデルが必要です。

このストリームでメッセージオブジェクトを送信する必要があります。

私はこれらのメッセージオブジェクトを含むブロッキングキューが必要だと思っています。スレッドのrun()メソッドは、使用可能なすべてのメッセージオブジェクトを取得し、trueの間に送信します。

私の質問は

  1. ながら、真のループよりも、これを行うには良い方法はありますか。おそらくwhile trueループでは、送信するメッセージがない場合、スレッドにyield/sleepを伝えることができます。

  2. もっと良い機種はありますか?私は、私のコードでプロセッササイクルがメッセージを待っているのを食べることにしばらく時間がかかっていれば心配です。

この経験がある方は、これについてもっと良い方法があるかどうか教えてください。

おかげで、限り、あなたのキューがブロック1であるとして、細かなメカニズムだ JBU

+0

まあ、両方の質問が同じであるように聞こえる... – jbu

答えて

0

。別のメッセージがキューに到着するのを待っている間に、プロセッサが自動的に処理されます。

キューを非ブロック的に読み取ると、CPU時間が浪費されます。一般的には、それを行うのが一層難しくなりますが、使用するキューのタイプによって異なります。

0

Javaはこれを行う2つの方法を実装しています。すでに対処している方法をブロックするか、または非ブロックメソッドによって実装しました。あなたがこの回答を見てみることができます方法をブロックすることにより、非同期通信を取得するための最も簡単な方法については

question 1041014

あなたは非ブロッキングメソッドを使用する場合は、NIOを見てみることを持っていますフレームワーク。それはいくつかの複雑な概念を使用しているので、最初に実装するのは特に簡単ではありませんが、通信イベントをどのように処理するかを理解すると、強力な実装を簡単に行うことができます。最終的にCPU時間が無駄になるのでブロック方法を使用することになりますが、NIOフレームワークではCPUとメモリの使用に最適な単一スレッド通信の実装を作成できます。

O'reilly NIOの本を見てください。

関連する問題