我有一个客户端 - 服务器架构。服务器可以有*客户端,因此每个客户端都会创建两个线程(输入和输出)。
我有一个主类来协调服务器端的所有操作。它(以及其他)有这样一种方法:
public static synchronized void sendMessageToUser(Message message, String username){
clientOutputThreadPool.submit(new ObjectStreamOutputCallable(userObjectOutputStreams.get(username), message));
}
objectOutputStreamCallable获取传递的特定用户的objectOutputStream(我将它们保存在hashmap中以重用它们)。 callable在线程池中执行
callable看起来像这样:
@Override
public Object call() throws Exception {
writeObjectToStream();
return null;
}
private synchronized void writeObjectToStream() throws IOException {
oos.reset();
oos.writeObject(message);
oos.flush();
}
现在我!有时候!得到上述错误(在客户端)。事实上,这只发生在大约30-40%的时间,让我相信,它与并发性有关。可能是例如正在序列化的消息对象是否同时在代码中的其他位置进行操作,然后创建错误?我已多次读过一个不能使用多个objectOutputStream或objectInputStream的内容。但我在我的代码中找不到任何地方,我在同一个客户端使用不同的objectOutputStreams。每个都有一个在创建套接字时创建的oos,然后保存在hashmap中供以后使用。我也在每封邮件之前重置套接字,但仍无效...