java multithreading两个线程同时从同一个对象输入流尝试readobject()

时间:2014-05-10 11:14:45

标签: java multithreading

我尝试制作纸牌游戏。我遇到线程问题。我只构造一次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有什么办法吗?

2 个答案:

答案 0 :(得分:4)

只需要一个线程读取流并完成每个对象需要完成的所有操作。

这个线程可以完成两个线程的所有工作和/或你可以在线程之间传递消息,让其他线程做额外的工作。

答案 1 :(得分:1)

如果ObjectInputStream只构造一次,然后只是将它的引用传递给另一个Thread,那么只需将该对象的访问权限放在synchronized块中,以确保只有一个线程可以访问它一次一个对象。


假设: ininPlayer1都代表同一个实际为ObjectInputStream且在不同主题之间共享的对象。

ClientService线程:

... 
Message message = null;
synchronized (in) {
    message = (Message) in.readObject();
}
...

游戏主题:

... 
Message msg = null;
synchronized (inPlayer1) {
    msg = (Message) inPlayer1.readObject();
}
...