MST

星途 面试题库

面试题:Java单线程池在日志处理场景中的应用

假设你负责一个Java应用的日志处理模块,要求将所有日志按顺序写入文件,简述如何使用Java单线程池来实现这一功能,并说明关键代码部分。
27.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 简述实现思路
    • 使用Java单线程池,即Executors.newSingleThreadExecutor()创建一个单线程的线程池。这样所有的日志写入任务都会在这个唯一的线程中顺序执行,从而保证日志按顺序写入文件。
    • 创建一个日志写入任务类,实现Runnable接口,在run方法中编写具体的日志写入文件逻辑。
    • 将日志写入任务提交到单线程池中执行。
  2. 关键代码部分
import java.io.FileWriter;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class LogProcessor {
    private static final String LOG_FILE = "app.log";
    private static final ExecutorService executor = Executors.newSingleThreadExecutor();

    public static void main(String[] args) {
        // 模拟日志写入任务
        String logMessage1 = "This is the first log message.";
        String logMessage2 = "This is the second log message.";
        writeLog(logMessage1);
        writeLog(logMessage2);
        // 关闭线程池
        executor.shutdown();
    }

    private static void writeLog(String logMessage) {
        executor.submit(() -> {
            try (FileWriter writer = new FileWriter(LOG_FILE, true)) {
                writer.write(logMessage + "\n");
                writer.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
}

在上述代码中:

  • Executors.newSingleThreadExecutor()创建了单线程池executor
  • writeLog方法接受一个日志消息字符串,在submit方法中传入一个实现了Runnable接口的匿名内部类,这个匿名内部类的run方法(这里通过lambda表达式实现)中使用FileWriter将日志消息写入文件,并追加换行符和刷新缓冲区。
  • main方法中模拟了两个日志写入任务,并在最后调用executor.shutdown()关闭线程池。