2

私の状況:

同時に 2 つのスレッドを実行しています。一方のスレッドは、ポートを使用するポイントに到達する前に特定の数のステップを実行する、もう一方のスレッドによってポートが使用されるまで待機したいと考えています。

私がコミットしなければならないもう 1 つの制限は、API を使用する JNI ネイティブ c コードの場合と同様に、ポートを開く前に手順を実行するスレッドが他のスレッドと簡単に通信できないことです (うまくいけば、問題には適用されません。大きなメソッドを実行する)

質問:

ポートが使用されるまでJavaが待機できる方法はありますか? 私はstackoverflowのソリューションを見てきましたが、いくつかの問題があります:

  1. 新しいソケットを作成するとポートが使用され、他のスレッドはこのソケットにアクセスできなくなります。
  2. netstat パーサーを使用すると、プロジェクトから移植性が失われます。

スタックオーバーフローの回答を見落としている場合は、検索できないなどの理由で叱ってください。何でも役に立ちます。

4

3 に答える 3

5

ポートが使用されるまでJavaが待機できる方法はありますか?

純粋な Java ではありません。

ただし、2 つのスレッドが同じ JVM で実行されていると仮定すると、それらは他の手段で通信できます。したがって、共有フラグ (たとえば、揮発性ブール変数またはAtomicBoolean) または aCountDownLatchまたは aを使用できますSemaphore。これらのいずれかを使用して、1 つのスレッド (事実上)がポートを使用していることを他のスレッドに伝える簡単な実装を行うことができます。

(実際、一方のスレッドが他方のスレッドを待機するようにする場合は、ラッチが最適です。)


これは、JNI で簡単に実行できるようなことではありません。私の知る限り、netstatプログラムはこれを行うために通常のシステムコールを使用しません。「/proc」ツリーまたは(古い実装では)カーネルメモリへの直接アクセスを使用して、必要な情報を取得していると思います。これをネイティブ ライブラリで複製することはできますが、これを行うための既存のライブラリが見つかるとは思えません。そしてもちろん、Windows の実装はまったく異なります...

于 2013-08-17T01:37:28.243 に答える
1

それに接続してみて、成功するまで数回スリープ/再試行してください。成功の魔法の予測因子はありません。

于 2013-08-17T03:10:16.147 に答える