1 创建线程的四种方式
-
继承 Thread 类并重写 run方法创建线程,实现简单但不可以继承其他类;
-
实现 Runnable 接口并重写 run 方法,避免了单继承局限性,编程更加灵活,实现解耦;
-
实现 Callable 接口并重写 call 方法,创建线程。可以获取线程执行结果的返回值,并且可以抛出异常;
-
使用线程池创建。
2 创建线程池的7种方式
线程池的创建方式总共包含以下 7 种(其中 6 种是通过 Executors
创建的,1 种是通过ThreadPoolExecutor
创建的):
- Executors.newFixedThreadPool:创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待;
- Executors.newCachedThreadPool:创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程;
- Executors.newSingleThreadExecutor:创建单个线程数的线程池,它可以保证先进先出的执行顺序;
- Executors.newScheduledThreadPool:创建一个可以执行延迟任务的线程池;
- Executors.newSingleThreadScheduledExecutor:创建一个单线程的可以执行延迟任务的线程池;
- Executors.newWorkStealingPool:创建一个抢占式执行的线程池(任务执行顺序不确定)【JDK 1.8 添加】。
- ThreadPoolExecutor:最原始的创建线程池的方式,它包含了 7 个参数可供设置,后面会详细讲。
单线程池的意义从以上代码可以看出 newSingleThreadExecutor 和 newSingleThreadScheduledExecutor 创建的都是单线程池,那么单线程池的意义是什么呢?
虽然是单线程池,但提供了工作队列,生命周期管理,工作线程维护等功能。