1、java创建线程的几种方式
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
- 线程池
- java.util.concurrent包下提供了Executors类可以去创建线程池(但不推荐这种方式创建,这种方式对线程池的控制粒度较低,如newFixedThreadPool方法中使用了无界队列(LinkedBlockingQueue),当一个请求进来之后,如果核心线程有空闲线程直接使用核心线程中的线程执行任务,不会添加到阻塞队列中,如果核心线程满了,新的任务会添加到阻塞队列,阻塞队列的容量过大。就会发生导致内存泄漏。 )
- 推荐使用ThreadPoolExecutor创建线程池
2、线程池的七个参数
public ThreadPoolExecutor( int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler
) {
.....
}
3、线程池的执行流程

4、线程池属性标识
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
private static final int RUNNING = -1 << COUNT_BITS;
private static final int SHUTDOWN = 0 << COUNT_BITS;
private static final int STOP = 1 << COUNT_BITS;
private static final int TIDYING = 2 << COUNT_BITS;
private static final int TERMINATED, = 3 << COUNT_BITS;
private static int runStateOf(int c) { return c & ~CAPACITY; }
private static int workerCountOf(int c) { return c & CAPACITY; }
5、线程池状态变化
