1

シリアル接続された 5 台のデバイスからデータを読み込もうとしています。デバイスが正常な場合は Java コードが正常に実行されますが、そうでない場合inputstream.read()はプログラムがハングし、それ以上実行できません。

inputstream.available()を使用してみBufferedInputStreamましたが、何も機能しません。

私がやりたいことは、デバイスが私のコードに応答しない場合、それ自体を終了し、コントロールをメインプログラムに渡して、そこで次のデバイスに移動することです。ソケットは、ポーリングの 1 サイクルの間開いたままになります。

Socket es = new Socket("10.12.90.153",4001); 
OutputStream osnew= es.getOutputStream(); 
InputStream isnew = new BufferedInputStream(es.getInputStream()); 

これはタスク プログラムで実行されます。その後、次のアクションのために 1 秒間隔で各デバイスに渡さosnewれます。isnewosnew、デバイスが応答するデータを書き込みます。次にisnew、プログラムがハングする ...This から読み取ります。

4

3 に答える 3

0

InputStreamデータを読み取ろうとしたときにブロックするように設計されており、利用できるものはありません。メソッドを呼び出して、available()ブロックせずにデータを読み取ることができるかどうかを確認できますが、これは一方向にしか機能しavailable()ません。ゼロ以外を返す場合は、ブロックせずに読み取ることができますが、ゼロを返す場合は必ずしもブロックされません。入力ストリームが から常にゼロを返すことは完全に有効ですavailable()

java.nioストリームを使用する代わりに、ノンブロッキング I/O API を調べることをお勧めします。

于 2013-06-19T12:21:31.380 に答える
0

各デバイスを個別のスレッドで処理できます。そうすれば、デバイスがそうでない場合でも、プログラムの応答性が維持されます。ただし、マルチスレッド プログラミングの落とし穴に注意してください。

Java でのマルチスレッド プログラミングの詳細については、http://docs.oracle.com/javase/tutorial/essential/concurrency/を参照してください。

于 2013-06-19T12:21:34.253 に答える
0

デバイスからどのように読み取っていますか? これを行うために何らかの形式の FileInputStream を使用していると仮定します。そのクラスはファイルシステムからの読み取りに適しているように見えますが、長時間ブロックする可能性のあるデバイスは、デバイスが応答するまで Java スレッドをロックする可能性があります。デバイスの時間制限のある読み取り要求を行う必要がありますが、それを行う Java クラスは知りません。

私が持っている最善の提案は、デバイスが応答を停止したときにうまく通信し、ブロックしない JNI コードを作成することです。これは、USB デバイスと話していたときに行ったことです。これをコーディングする場合 (Linux の場合)、select (期間の引数を持つ) を使用して、いずれかのデバイスからの入力を待ちます。

于 2013-06-19T12:32:35.240 に答える