如何通过两个线程同步关闭套接字?

时间:2013-01-21 21:24:05

标签: java android synchronized

我有两个线程,一个用于读取,一个用于通过同一个套接字写入数据。什么时候连接问题两个线程捕获异常并尝试重新连接。为此,他们调用相同的方法

   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();
        }
    }

并在第二个之后尝试建立连接:

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;
        }

问题是如何避免尝试从两个线程一个接一个地尝试连接服务器(在连接错误之后 - 例如,在服务器关闭连接之后)。我的意思是:如果一个线程尝试连接,第二个线程应该知道这个并且不要尝试做同样的事情但是等待第一个建立连接(以避免永久战斗线程问题断开,连接,断开,连接....) 。我试过同步但我的经验太小了。 问候, ARTIK

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

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

或者您可以在对象中实现套接字操作,并使用锁在线程之间共享该对象。

答案 1 :(得分:0)

使用适当的互斥锁定。这将确保只有一个线程将访问代码的connect()部分。