我尝试制作纸牌游戏。我遇到线程问题。我只构造一次objectinputstream,然后只是向其他Thread发送一个引用,两个线程同时尝试从同一个objectinputstream读取一个对象。同样的问题是java.io.StreamCorruptedException: invalid type code: 00但它没有解决
ClientService线程:
while (true) {
try {
Message message = (Message) in.readObject();
handleClientMessage(message);
if (message.getType() == Message.messageType.ClientDisconnect) {
break;
}
} catch (IOException ex) {
Logger.getLogger(ClientServiceThread.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(ClientServiceThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
游戏线程
public void run() {
startGame();
while (true) {
try {
Message msg = (Message) inPlayer1.readObject();
handlePlayerMessage(msg);
} catch (IOException ex) {
Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
in和inplayer1相同的objectinputstream.I得到一个异常:java.io.StreamCorruptedException:无效的类型代码:00。两个类只做一个不同的工作,这部分是相似的。请给出一个建议我如何解决这个问题.Is有什么办法吗?
答案 0 :(得分:4)
只需要一个线程读取流并完成每个对象需要完成的所有操作。
这个线程可以完成两个线程的所有工作和/或你可以在线程之间传递消息,让其他线程做额外的工作。
答案 1 :(得分:1)
如果ObjectInputStream
只构造一次,然后只是将它的引用传递给另一个Thread,那么只需将该对象的访问权限放在synchronized
块中,以确保只有一个线程可以访问它一次一个对象。
假设: in
和inPlayer1
都代表同一个实际为ObjectInputStream
且在不同主题之间共享的对象。
ClientService线程:
...
Message message = null;
synchronized (in) {
message = (Message) in.readObject();
}
...
游戏主题:
...
Message msg = null;
synchronized (inPlayer1) {
msg = (Message) inPlayer1.readObject();
}
...