当前位置: 首页 > 知识库问答 >
问题:

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

锺离霖
2023-03-14

每个人希望您能在这方面帮助我:我有两个线程,负责处理来自客户端的连接。

这是我的密码

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个答案

段晨
2023-03-14

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

package com.ca.training.task.app;

import java.io.IOException;
import java.net.ServerSocket;

public class App {

    public void execute() {
        LoginRunnable loginRunnable = new LoginRunnable();
        loginRunnable.setLoginInformation(new Object());//Login information

        FileRunnable fileRunnable = new FileRunnable();//Data for loaded runnable.
        fileRunnable.setParams(new Object());

        startLoginThread(loginRunnable);
        startFileThread(fileRunnable);
    }

    private static void startLoginThread(LoginRunnable loginRunnable) {
        Thread loginThread = new Thread(loginRunnable);
        loginThread.start();
    }

    private static void startFileThread(FileRunnable fileRunnable) {
        Thread loadedThread = new Thread(fileRunnable);
        loadedThread.start();
    }

    class LoginRunnable implements Runnable {

        private Object loginInformation;

        @Override
        public void run() {
            try {
                ServerSocket loginSocket = new ServerSocket(8000);
                loginSocket.accept();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public Object getLoginInformation() {
            return loginInformation;
        }

        public void setLoginInformation(Object loginInformation) {
            this.loginInformation = loginInformation;
        }
    }

    class FileRunnable implements Runnable {

        private Object params;

        @Override
        public void run() {
            try {
                ServerSocket fileSocket = new ServerSocket(7000);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public Object getParams() {
            return params;
        }

        public void setParams(Object params) {
            this.params = params;
        }
    }
}
郜振国
2023-03-14

新登录读取(loginSocket.accept(),LoginInformation)行。开始()包含方法调用loginSocket。accept(),它将在创建此线程之前调用。此方法调用将被阻止,直到客户端登录。(此外,第二个线程将被fileSocket.accept()阻塞)。

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

钱跃
2023-03-14

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

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

 类似资料:
  • 问题内容: 有没有人在编写比较两个REST服务的测试方面有任何技巧?我们这样做是作为回归测试的一种形式。 我希望按照以下方式做一些事情: 向两个服务发送“ / 1”的GET并比较结果 向这两个服务发送POST,然后比较结果 向两个服务发送一个PUT,并比较结果 这个想法是: 每个操作都发送到两个服务 结果应该相同 REST服务是用Java / Jersey编写的,因此使用它是理想的,但是人们发现有

  • 问题内容: 假设我有这个: 问题: break语句会将我带出两个循环还是仅从内部循环带出?谢谢。 问题答案: 在您的示例中,break语句将使您退出while(b)循环

  • 问题内容: 我有一个带有表“ Staff”的数据库(SQL),其中有两个记录。我需要使用PHP在网页上显示这些记录的内容。 我将如何正确更改while循环,以便它将在页面上显示两个记录。 谢谢! 问题答案: 仅从数据库中检索一行。您需要在循环中调用它以检索所有行。该增量是不必要在这里,因为返回false时,没有更多行可供选择。

  • 无法找到这个问题的答案。我有一个mysqli循环语句。在这个循环中,我想运行另一个查询。我不能同时编写这两个sql。可能吗?我想,因为我使用stmt并设置它来准备语句。所以我添加了另一个变量stmt2。单独运行它们是可行的,但像我写的那样运行它会给我“mysqli致命错误:对非对象调用成员函数bind_param()” 伪代码: 答案是: 我真傻,我不知道我必须有两个mysqli连接。所以解决方案

  • 问题内容: 我正在使用python更新一些LED。我一直在这样做: 我想用Flask充当一些我可以在我的浏览器中运行的ReactJS前端(以更改当前模式等)与Python中的LED控制代码之间的桥梁。 我的Flask工作正常,可以处理HTTP请求,等等。我想知道如何设置我的flask应用程序同时连续运行(或快速运行),同时仍然能够相互通信,就像这样: 我遇到了,这似乎可以解决问题,但对于我的问题有

  • 问题内容: 以下示例在Node.js书中给出: 解释了while循环为何阻止执行时,作者说: 节点将永远不会执行超时回调,因为事件循环卡在了循环中,而循环在第7行开始了,因此永远不会给它处理超时事件的机会! 但是,作者没有解释为什么这是在事件循环的背景下发生的,还是在幕后真正发生了什么。 有人可以详细说明吗?为什么节点卡住?以及如何在保留控制结构的同时更改上述代码,以使事件循环不会被阻塞,并且代码