并发面试题笔记

1 如何创建线程 1) 实现Runnable接口 实现run()方法 1new Thread(MyRunnable()).start(); 2)继承Thread类 重写run()方法 3)Callable接口&&FutureTask 实现Callable call()方法,使用FutureTask包装Callable对象,通过Thread启动 1FutrueTask<ReturnType> task = new FutrueTask<>(MyCallable()); 2Thread(task).start 3 4ResultType res = task.get(); // 这里阻塞 4)使用线程池 通过ExecutorService提交Runnable或者Callable任务 不同方法对比 1Runnable vs Callable 2Callable:可以返回结果,可以抛出异常 3 4线程池的优势:避免重复创建和销毁线程,减少这部分重复带来的开销; 5ThreadPool => (FixedThreadPool, CachedThreadPool, ScheduledThreadPool) 6 7虚拟线程:虚拟线程创建和切换开销更低 8Thread.startVirtualThread() ThreadPool实践 XXXThreadPool.submit(task…) 1FixedThreadPool: 固定池中线程数量 => 适合1.执行较长任务;2.控制并发度 2 3CachedThreadPool:池中线程数量不固定,根据需要动态创建线程,空的被回收,少了多创建; 4⭐适用于任务执行时间短且任务数量不确定的场景; 5 6ScheduledThreadPool:适用于需要定时执行或周期性执行任务的场景。 1// 定时任务线程池 2ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); 3// For 延迟任务 4scheduledThreadPool.schedule(() -> { 5 // 任务逻辑 6}, 10, TimeUnit.SECONDS); // 延迟10秒执行 7 8// For周期执行任务 9scheduledThreadPool.scheduleAtFixedRate(() -> { 10 // 任务逻辑 11}, 0, 1, TimeUnit.SECONDS); // 每隔1秒执行一次 Thread.sleep(0) <= 主动让出CPU控制权 ...

March 5, 2025 · 11 min · 2162 words · LongWei