线程池— —必知必会
-
线程池优势
-
Callable接口
Runnable - FutureTask - Callable (适配器模式)
*高考遇到不会的题,先跳过,后面再回来做 -
获得线程的4种方法:
Thread
Runnable
Callable
线程池 -
线程池3个常用方式(线程池底层:ThreadPoolExecutor)
Executors.newFixedThreadPool(5);
Executors.newSingleThreadExecutor();
Executors.newCachedThreadPool();
①线程池用过吗?底层是如何实现的?
-
线程池7大参数
corePoolSize
maximumPoolSize
keepAliveTIme
unit
workQueue 阻塞队列:候客区
theadFactory 用于创建线程
handler 拒绝策略 -
线程池底层工作原理
核心线程数满了 > 阻塞队也列满了(候客区)> 填派人员(maximumPoolSize)
② 请你谈谈线程池的拒绝策略?
等待队列满了,也达到了最大线程数 > 拒绝策略
·AbortPolicy(默认) 报异常
·CallerRunsPolicy 将某些任务回退到调用者
·DiscardOldestPolicy 丢弃等待时间最久的
·DiscardPolicy 直接丢弃
③你在工程中是否使用过线程池?是否自定义过线程池?
》线程池不使用Executors去创建,而是通过ThreadPoolExecutor方式(手写线程池)
import java.util.concurrent.*;
public class MyThreadPoolDemo {
public static void main(String[] args) {
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2,5, 1L, TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardOldestPolicy());
try {
for (int i = 1; i <= 10 ; i++) {
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + "\t 办理业务");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
}
}