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.");
}
}
parseLog
方法来模拟处理日志的过程。这里我们假设每个日志处理需要1秒。Executors.newFixedThreadPool(4)
创建一个包含4个线程的线程池。executorService.submit(log::parseLog)
将每个日志的处理任务提交给线程池。executorService.shutdown()
来关闭线程池,并通过循环等待所有任务完成。运行该程序后,所有16个日志对象将会在大约4秒内被处理完毕,因为4个线程会并行处理这些日志。