Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过两个线程同步关闭套接字?_Java_Android_Synchronized - Fatal编程技术网

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

Java 如何通过两个线程同步关闭套接字?,java,android,synchronized,Java,Android,Synchronized,我有两个线程,一个用于读取,一个用于通过同一套接字写入数据。当连接出现问题时,两个线程捕获异常并尝试重新连接。为此,它们调用相同的方法 public synchronized void close_connection() { try { socket.shutdownInput(); socket.shutdownOutput(); socket.close(); try {

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

   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

您可以尝试以下方法:

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

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

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

尝试用谷歌搜索“生产者-消费者”