MST

星途 面试题库

面试题:Java实现网络应用架构设计之多线程网络编程

在Java网络应用架构中,常需要处理多线程网络编程。请描述如何使用Java多线程实现一个简单的服务器端,能够同时处理多个客户端连接,并且简要说明在这个过程中如何处理线程安全问题。
39.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

使用Java多线程实现简单服务器端处理多客户端连接

  1. 创建ServerSocket:通过ServerSocket类来监听指定端口,等待客户端连接。例如:
ServerSocket serverSocket = new ServerSocket(12345);
  1. 接受客户端连接并启动新线程处理:在一个循环中,调用serverSocket.accept()方法来接受客户端连接。每当有新的连接到来,创建一个新的线程来处理该客户端的请求。示例代码如下:
while (true) {
    Socket clientSocket = serverSocket.accept();
    new Thread(() -> {
        try {
            // 处理客户端请求逻辑
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                out.println("Server received: " + inputLine);
                if ("exit".equals(inputLine)) {
                    break;
                }
            }
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }).start();
}

处理线程安全问题

  1. 共享资源同步:如果多个线程需要访问共享资源(如共享的数据库连接池、全局计数器等),使用synchronized关键字来同步访问。例如:
private static int counter = 0;
public static synchronized void incrementCounter() {
    counter++;
}
  1. 使用线程安全的集合类:在多线程环境下,避免使用非线程安全的集合类,如ArrayListHashMap。应使用线程安全的替代类,如CopyOnWriteArrayListConcurrentHashMap。例如:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
  1. 锁的粒度控制:尽量减小锁的粒度,只对需要同步的关键代码块加锁,以提高并发性能。例如:
private final Object lock = new Object();
public void someMethod() {
    // 非关键代码
    synchronized (lock) {
        // 关键代码,需要同步
    }
    // 非关键代码
}
  1. 使用线程局部变量:对于每个线程都需要独立的变量,可以使用ThreadLocal类。例如:
private static ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 0);
public void someMethod() {
    int value = threadLocalValue.get();
    value++;
    threadLocalValue.set(value);
}