2012-03-10 18 views
1

私はJavaスレッドを開始してソケットを聴いています(ソケット読み込みがスレッドをブロックしていることが必要であると考えます)。ソケットと実行クラスメソッドを管理するためのJavaスレッド

スレッドがソケットからデータを受け取った後、クラスからメソッドを呼び出す必要があります。

今、私はこれを行うには、2つのオプションがあります。

は、スレッドに渡され、クラスで実装されたインタフェースを宣言します。スレッドがインタフェースメソッドを呼び出すと、実装クラスはそれを実行します。

または、クラスインスタンスをパラメータとしてスレッドに渡して、クラスメソッドを呼び出すことができます。

しかし、メソッドが実行されている間にスレッドがブロックするかどうかを知りたかったのです。

私はそう思っていますが、わかりません。

私はスレッドにSocketイベントの動作をさせたいと思っていました。私が意味するのは、スレッドから呼び出されたメインクラスのソケットとファイヤー関数からデータを読み込むことだけです。

答えて

2

はい、スレッドはメソッドの実行中にブロックされるため、同時にソケットから読み取ることはできません。情報が失われることはありません。転送に時間がかかります。計算に時間がかかりすぎると、ソケットタイムアウトが発生する可能性があります。

実行に時間がかかる場合は、別のワーカースレッドで実行する必要があります。そのためにはExecutorを使用することをお勧めします。

0

しかし、私は、スレッドブロック場合、このメソッドは

を実行している間、はい、それはブロックさん知りたいと思いました。
あなたは唯一のはメソッドが実際にあなたのケースでは

をするのか、何を1つのだけのオプションを持っている重要尋ねるように、そのインターフェイスなどであればそれは問題ではない何かを処理するメソッドを呼び出しrun内部の場合。
コントロールをソケットリスニングスレッドのasapに戻すことを確認してください。
これは、別のスレッドで処理を処理するように処理クラスを設計/命令することによって発生する可能性があります。
実際、あなたの問題は新しいものではありません。イベントベースの設計では、イベントキューベースのフローをブロックしないようにできるだけ速くイベントを処理する必要があります。
これは私がarroundを設計することをお勧めします。リスニングスレッドとのやりとりにはインタフェースを使用せず、イベントリスナーを登録してください。

イベントが発生すると、リスニングスレッドはデータを読み取りますが、データはイベントとしてリスナーに渡され、その時点でブロックされます。
そして、あなたは様々なオプションを持っているあなたが処理を行うための新しいスレッドを開始する必要がありますし、リスニングのスレッドがその作業

2

を続行することができます

  • スレッドの子クラス(簡単にコードが、あなた、あなたのクラスを作ります(スレッドを拡張する)テクニカルアスペクト(マテリアルの部分をマージする)
  • クラスがRunnableインターフェイスを実装し、そのRunnableで新しいスレッドを開始するようにします。あなたのメインコードはまだオーバーライドされた実行メソッドに残っていますが、継承ツリーはあなた次第です(あなたのメインクラスはあなたの他のクラスを拡張することができます)
  • メインコード/スレッドを2つのクラスメインコード、スレッド用)、2つをあなたの意志でリンクします(例えば、別のクラスの内部スレッドを作成する場合、内部スレッドは最終的なプロパティを使用できます)。

他の答えで述べたように、run()メソッドで起こっていることはもちろん、実行をブロックしています。

スレッドとソケットを扱う場合は、NettyのようなNIOフレームワークを見てみることを強くお勧めします。これは、この種の動作のためだけにあります。イベント駆動型クライアント/サーバーアプリケーションNewIOソケット。別の追記として

、私は多くの場合、このパターンを使用します。

    がイベントをキャッチする取得スレッドを開始
  • リンクブロックキュー(queue.offer())でそれらを押します。
  • 同じリンクブロックキュー(queue.take()を使用)を共有する別のスレッドがあります。この操作はブロックされており、キューが空である限りスレッドはブロックされます。

これは、1つのスレッドを「プロデューサ」として、1つのスレッドを「コンシューマ」として持つ非常に簡単な方法です。あなたは、同じキューで待っているさまざまな消費者を持つことさえできます。

+0

NIOを参照する場合+1 –

関連する問題