1

2つのスレッドがあります。1つは読み取り用、もう1つは同じソケットを介したデータの書き込み用です。接続に問題がある場合、2つのスレッドが例外をキャッチして再接続を試みます。これを行うには、同じメソッドを呼び出します。

   public synchronized void close_connection() {
        try {
            socket.shutdownInput();
            socket.shutdownOutput();
            socket.close();
            try {
                Thread.sleep(500);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }

そしてそれの後に接続を確立しようとする2番目のもの:

public synchronized boolean connect() {
            boolean result=true;
            socket = new Socket();
            try {
                socket.connect(new InetSocketAddress(address, port), 500);
                in = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                out = new BufferedWriter(new OutputStreamWriter(
                        socket.getOutputStream()));
            } catch (IOException e) {
                result=false;

            }
            return result;
        }

問題は、2つのスレッドから1つずつサーバーにすぐに接続しようとしないようにする方法です(接続エラーの後-たとえば、サーバーによる接続を閉じた後)。つまり、1つのスレッドが接続を試みた場合、2番目のスレッドはこれを認識し、同じことを試みないで、最初のスレッドによる接続の確立を待ちます(永続的なファイトスレッドの問題を回避するために、切断、接続、切断、接続...) 。同期を試しましたが、経験が少なすぎます。よろしく、Artik

4

2 に答える 2

0

適切なミューテックス ロックを使用します。これにより、1 つのスレッドのみがコードの connect() 部分にアクセスするようになります。

于 2013-09-20T08:35:59.530 に答える
0

次のようなことを試すことができます:

while(not connected){
   try reconnecting
   if(success){
      //Everything is ok, go on
   } else {
      //sleep for random period of time and retry
   }
}

または、ソケット操作をオブジェクトに実装し、ロックを使用してスレッド間でそのオブジェクトを共有できます。

于 2013-01-21T22:17:24.570 に答える