適切にコーディングします。connect() が失敗した場合は、問題をログに記録し、バックオフ タイムを待ってから再試行します。サーバーがリッスンしている場合でも、connect() が他の理由で失敗する可能性があります (たとえば、ネットワーク API のどこかのレイヤーでバッファーがいっぱいになっているなど)。これIOException
が制御された例外であり、Java コンパイラは明示的にそれを処理することを期待してIOException
います。
private static final Logger LOG = Logger.getLogger(YourClass.class);
for (int waitTime = 10; waitTime < 10000; waitTime *= 2) {
try {
socket.connect();
} catch (ConnectException ex) {
LOG.log(Level.WARNING,
"Connection failed, retrying in " + waitTime + " ms...", ex);
Thread.sleep(waitTime);
} catch (IOException ex) {
throw new RuntimeException("Unexpected IO Exception", ex);
}
}
バリアやシグナリングなど、いくつかの同期プリミティブを使用した場合でも、サーバー スレッドはlisten() が実際に有効になる前に常にシグナルを送信します。そのため、不正なスレッド インターリーブが発生する可能性は依然としてあります。