【问题标题】:java multithreading two thread try to readobject() from same object input stream at the same timejava多线程两个线程尝试同时从同一对象输入流中读取对象()
【发布时间】:2014-06-28 02:55:06
【问题描述】:

我尝试制作纸牌游戏。我遇到了线程问题。我只构造了一次objectinputstream,然后只是将它的引用发送给另一个线程,两个线程尝试同时从同一个objectinputstream 中读取一个对象。同样的问题是java.io.StreamCorruptedException: invalid type code: 00,但它没有解决。

客户端服务线程:

    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);
        }
    }
}

在和inplayer1相同的objectinputstream。我得到一个异常:java.io.StreamCorruptedException:无效类型代码:00。两个类做不同的工作只有这部分是相似的。请告诉我如何解决这个问题。是有什么办法吗?

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    只有一个线程读取流并为每个对象做所有需要做的事情。

    此线程可以完成两个线程的所有工作和/或您可以在线程之间发送消息以让其他线程完成额外的工作。

    【讨论】:

    • 感谢您的帮助
    【解决方案2】:

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


    假设:ininPlayer1 都表示同一个对象,实际上是 ObjectInputStream,并在不同线程之间共享。

    客户端服务线程:

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

    游戏主题:

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

    【讨论】:

    • 谢谢,但是通过这种方式只有一个线程读取消息(有时是游戏屏幕有时是客户端服务)我希望两个线程同时到达相同的消息。
    • 你还没有提到这件事。不用担心,至少它会解决StreamCorruptedException
    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2011-03-07
    • 2014-05-01
    相关资源
    最近更新 更多