面试题答案
一键面试- 创建线程池:
- 可以使用
ThreadPoolExecutor
类来创建线程池。以下是一个简单的示例:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class LoggingThreadPool { private static final ExecutorService executor = Executors.newFixedThreadPool(5); // 创建一个固定大小为5的线程池 }
- 可以使用
- 定义日志记录任务:
- 实现
Runnable
接口来定义日志记录任务。
public class LoggingTask implements Runnable { private final String logMessage; public LoggingTask(String logMessage) { this.logMessage = logMessage; } @Override public void run() { // 这里实现实际的日志记录逻辑,例如写入文件或发送到日志服务器 System.out.println("Logging: " + logMessage); } }
- 实现
- 提交日志记录任务到线程池:
- 在需要记录日志的地方,创建
LoggingTask
实例并提交到线程池。
public class Main { public static void main(String[] args) { String logMessage = "This is a test log message"; LoggingTask task = new LoggingTask(logMessage); LoggingThreadPool.executor.submit(task); } }
- 在需要记录日志的地方,创建
- 关闭线程池:
- 在应用程序关闭时,需要关闭线程池以释放资源。
import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; public class ShutdownThreadPool { public static void shutdownExecutor(ExecutorService executor) { executor.shutdown(); try { if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { executor.shutdownNow(); if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { System.err.println("Pool did not terminate"); } } } catch (InterruptedException ie) { executor.shutdownNow(); Thread.currentThread().interrupt(); } } }
- 然后在合适的地方(例如应用程序关闭钩子)调用
shutdownExecutor
方法:
public class Main { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(5); // 提交任务等操作 Runtime.getRuntime().addShutdownHook(new Thread(() -> { ShutdownThreadPool.shutdownExecutor(executor); })); } }