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()部分。尝试用谷歌搜索“生产者-消费者”