在这种情况下如何使用Thread.join()?

时间:2014-05-14 06:27:53

标签: java multithreading serversocket

我正在编写一个简单的轮盘游戏,一次可以让多个玩家参与其中。 我试图反序列化.dat文件players.dat,但是我得到的FileNotFoundException我怀疑是由于我的主线程同时运行到另一个线程。

我的主文件(注意readObj只是一个方便的方法,它使用ObjectInputStream来读取对象):

    Collection<Player> mPlayerList = null;

    try {
        connectToServer();
    } catch (IOException e) {
        System.err.println("IO exception when trying to write/connect to server");
        e.printStackTrace();
    }

    // read input stream and attempt to deserialize
            // stack trace points to the error being from here
    try {
        mPlayerList = (Collection<Player>) readObj("players.dat");
    } catch (IOException e) {
        System.err.println("IO exception when trying to read master player list");
        e.printStackTrace();    
        System.exit(1);     
    } catch (ClassNotFoundException e) {
        System.err.println("Class not found exception when trying to read master player list");
        e.printStackTrace();    
        System.exit(1);                 
    }

在我的第一个try语句中,我尝试连接到运行我的计算机的服务器:

public class GameEngineServerStub {

public static void main(String[] args) throws IOException {

    GameEngineImpl myEngine = new GameEngineImpl();

    int portNumber = 4444;
    boolean listening = true;

    // While statement loops forever, waiting for a client to connect.
    // Once client connects, accept, create a new Thread, pass the socket to it, and requests it to start
    try (ServerSocket serverSocket = new ServerSocket(portNumber)) {
        while (listening) { 
            new GameEngineServerStubThread(serverSocket.accept(), myEngine).start();
        }
    } catch (IOException e) {
        System.err.println("Could not listen on port 4444");
        System.exit(-1);
    }

}

 }

服务器启动此线程,该线程负责从另一个文件请求Collection<Player>对象,并尝试对其进行序列化。

public void run() {

    try (
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    ) {

        Collection<Player> currentPlayers = engine.getAllPlayers();

        try {
            ObjectOutputStream objOut = new ObjectOutputStream(new FileOutputStream("players.dat"));
            objOut.writeObject(currentPlayers);
        } catch (IOException e) {
            System.err.println("IO Exception when trying to get master player list!");
            e.printStackTrace();
            System.exit(1);                     
        }

    } catch(IOException e) {
        e.printStackTrace();
    }

}
}

我假设我需要暂停main线程,等待序列化线程完成,但我不确定如何执行此操作。

1 个答案:

答案 0 :(得分:0)

我不确定您问题的某些方面,但根据您的具体情况,您可以做一系列事情

您的服务器和客户端正在不同的JVM上运行

这种情况下你需要一个难以进行的进程间锁定,你可以试试JCIP也许你可以看看here来获得一些想法

您的服务器和客户端在同一个JVM上运行,但在不同的线程中运行

这种情况更容易,您可以使用java的锁数来实现这一点,例如最简单的方法是创建一个ReentrantReadWriteLock并将其传递给两个线程并使服务器保持不变写锁定直到序列化完成,并使客户端阻塞读锁定。您可以在java herehere

中阅读有关锁定和锁定的更多信息