以下函数在其自己的线程中执行:
private void doSendData()
{
try {
//writeToFile(); // just a temporary location of a call
InetAddress serverAddr = InetAddress.getByName(serverAddress);
serverAddr.wait(60000);
//Log.d("TCP", "C: Connecting...");
Socket socket = new Socket(serverAddr, portNumber);
socket.setSoTimeout(3000);
try {
//Log.d("TCP", "C: Sending: '" + message + "'");
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
String message = packData();
out.println(message);
Log.d("TCP", "C: Sent.");
Log.d("TCP", "C: Done.");
connectionAvailable = true;
} catch(Exception e) {
Log.e("TCP", "S: Error", e);
connectionAvailable = false;
} finally {
socket.close();
announceNetworkAvailability(connectionAvailable);
}
} catch (Exception e) {
Log.e("TCP", "C: Error", e);
announceNetworkAvailability(connectionAvailable);
}
}
当执行到达该行时serverAddr.wait(60000)
,将引发异常:
java.lang.IllegalMonitorStateException: object not locked by thread before wait()
有谁知道如何锁定对象或函数以防止并发?我试图添加一个Lock对象:
private final Lock lock = new ReentrantLock();
和线
boolean locked = lock.tryLock();
在功能开始时,但是没有用。
为了在一个对象上调用wait(),您必须在该对象上持有同步锁(尽管该锁实际上是在线程等待时释放的):
synchronized (serverAddr) {
serverAddr.wait();
}
我必须承认,在这种情况下,为什么您要这样做让我感到困惑...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句