2013-01-21 35 views
1

我有两个线程,一个用于读取,一个用于通过同一个套接字写入数据。当与连接问题两个线程捕获异常,并尝试reconnect.To为此,他们调用相同的方法如何通过两个线程同步关闭套接字?

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

+0

尝试谷歌“生产者消费者” –

回答

0

你可以尝试这样的事:

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

,或者你可以在一个对象执行套接字操作,并使用锁分享您的线程之间的对象。

0

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