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

Java while循环中的两个服务器线程相互阻塞,java,multithreading,network-programming,Java,Multithreading,Network Programming,大家好。 希望你能帮我解决这个问题: 我有两个线程,负责处理来自客户端的连接 这是我的密码 ServerSocket loginSocket = new ServerSocket(8000); ServerSocket fileSocket = new ServerSocket(7000); while (running) { new LoginThread(loginSocket.accept(),loginInormation).start(); new LoaderThread(

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

这是我的密码

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();
我没有收到任何错误消息,所以为什么会发生这种情况,我如何修复它

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


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

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


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

在不同的线程中启动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;
        }
    }
}
loginSocket.accept()
可能正在等待连接?我查看了一下:我看不出你错在哪里。我想我们需要更多的代码。例如,
LoginThread
LoaderThread
中的内容。另外,您确定没有以静默方式捕获异常吗?