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
中的内容。另外,您确定没有以静默方式捕获异常吗?