私は以下のようにサーバーに接続するクラスを持っています。Javaのスレッド間に "フラグ"を設定する
@Override
public void run() {
while (running) {
try {
msgHandler.log("Connecting to " + host + ":" + port);
Socket s = new Socket(host, port);
if (s.isConnected() && !s.isClosed()) {
msgHandler.connectionInit(s);
}
BufferedInputStream input = new BufferedInputStream(s.getInputStream());
}
}
msgHandlerであるコンシューマは、以下のように接続が切断されると、頻繁にソケットをポーリングします。
@Override
public void connectionInit(Socket s) throws IOException {
logger.info("Connected to AWW Service on " + configuration.getAwwHost() + ":" + configuration.getAwwPort());
output = new BufferedOutputStream(s.getOutputStream());
connector.componentReady();
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
try {
pollServer();
} catch (IOException e) {
// SOCKET GETS BROKEN HERE
}
}
}, 0, 25000);
}
質問は、どのように私は、ソケット接続を実行()スレッドに戻って壊れますときに私が得る例外から通信できているので、ソケットと、入力ストリームを再初期化しようとすることができますか?
ここでwait()はrun()スレッドをスリープ状態にするため、notify()またはwait()メカニズムは適切ではないと思います。 私は、接続が壊れたときにフラグを設定するのと同じことを考えていました。run()スレッドは常にフラグをチェックし、trueに設定されている場合はソケットを再初期化します。しかし、私はこれを達成するためにJavaに固有のより効率的なマルチスレッドアプローチがあると確信しています。