while循环中的两个服务器线程相互阻塞

时间:2017-06-13 14:16:56

标签: java multithreading network-programming

大家。 希望你能帮我解决这个问题: 我有两个线程,其任务是处理来自客户端的连接。

这是我的代码

ServerSocket loginSocket = new ServerSocket(8000);
ServerSocket fileSocket = new ServerSocket(7000);

while (running) {
  new LoginThread(loginSocket.accept(),loginInormation).start();
  new LoaderThread(fileSocket.accept()).start();
}

当我尝试连接到loginSocket两次时,服务器将阻塞并停止工作,阻止客户端,但如果我删除它,则不会发生这种情况:

new LoginThread(loginSocket.accept(),loginInormation).start();

我没有收到任何错误消息,为什么会发生这种情况,我该如何解决?

3 个答案:

答案 0 :(得分:0)

accept()方法是一种阻止方法,这意味着在与loginSocket()建立连接之前,您的程序不会继续。

当您创建LoginThread时,程序会等待连接以设置对象的第一个参数,并且在建立连接之前不会继续执行。

答案 1 :(得分:0)

new LoginThread(loginSocket.accept(),loginInormation).start();包含方法调用loginSocket.accept(),它将在创建此线程之前调用。此方法调用将阻塞,直到客户端登录。(此外,第二个线程将被fileSocket.accept()阻止)。

至于解决方案,我会将accept()调用移到每个线程内部。您需要将套接字传递给线程,以便它们执行此操作。

答案 2 :(得分:0)

在不同的线程中启动fileSocket和登录套接字

    INDEX     VAL
0        1  23.0
1   250001  23.0
2   500001  23.0
3   750001  18.0
4  1000001   0.0