Java多线程实现日志并行处理的示例代码

Java Q&A Hub 使用 GPT-4o-mini 回答

问题:

Java面试题之多线程 现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日志对象。

回答:

要实现这个需求,我们可以使用Java的多线程功能。我们将创建一个线程池,使用4个线程来并行处理16个日志对象。下面是一个简单的示例代码,展示了如何实现这个功能。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Log {
    private final String message;

    public Log(String message) {
        this.message = message;
    }

    public void parseLog() {
        // 模拟日志处理时间
        try {
            Thread.sleep(1000); // 假设每个日志处理需要1秒
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        System.out.println("Processed: " + message);
    }
}

public class LogProcessor {
    public static void main(String[] args) {
        // 创建16个日志对象
        Log[] logs = new Log[16];
        for (int i = 0; i < logs.length; i++) {
            logs[i] = new Log("Log message " + (i + 1));
        }

        // 创建一个线程池,包含4个线程
        ExecutorService executorService = Executors.newFixedThreadPool(4);

        // 提交日志处理任务
        for (Log log : logs) {
            executorService.submit(log::parseLog);
        }

        // 关闭线程池
        executorService.shutdown();
        while (!executorService.isTerminated()) {
            // 等待所有任务完成
        }

        System.out.println("All logs processed.");
    }
}

代码说明:

  1. Log类:表示一个日志对象,包含一个parseLog方法来模拟处理日志的过程。这里我们假设每个日志处理需要1秒。
  2. LogProcessor类:主类,创建16个日志对象,并使用一个固定大小为4的线程池来处理这些日志。
  3. ExecutorService:使用Executors.newFixedThreadPool(4)创建一个包含4个线程的线程池。
  4. 提交任务:通过executorService.submit(log::parseLog)将每个日志的处理任务提交给线程池。
  5. 关闭线程池:使用executorService.shutdown()来关闭线程池,并通过循环等待所有任务完成。

运行效果:

运行该程序后,所有16个日志对象将会在大约4秒内被处理完毕,因为4个线程会并行处理这些日志。