实现多线程的方式
- 继承Thread类,重写run方法,调用start方法启动线程 
- 实现Runnable接口,重写run方法,调用start方法启动线程 
- 实现Callable接口,重写call方法,并用FutureTask包装,在new Thread中传入FutureTask,然后调用start方法启动线程 
- 使用线程池 
保证线程安全的方式
- synchronized关键字实现的同步方法或者同步代码块 
- ReentrantLock等实现的锁机制 
- volatile关键字实现的变量线程安全 
- 使用AtomicInteger等原子类 
- 使用ConcurrentHashMap等线程安全容器 
线程有哪些状态?
五个状态:初始化(New)、可运行(Runnable)、运行中(Running)、阻塞(Blocked)、死亡(Dead)。

线程状态图
线程池的7个参数
public ThreadPoolExecutor(int corePoolSize,                             int maximumPoolSize,                             long keepAliveTime,                             TimeUnit unit,                             BlockingQueue<Runnable> workQueue,                             ThreadFactory threadFactory,                             RejectedExecutionHandler handler)   
- corePoolSize 核心线程数:一直存活的核心线程,不会销毁。 
- maximumPoolSize 最大线程数:提交一个任务,会先进入工作队列,如果队列无法加入,会创建新线程,然后从工作队列中取出一个任务交给新线程来处理,而刚提交的任务会进入工作队列。如果创建新线程导致线程数量超过最大线程,则会执行拒绝策略。 
- keepAliveTime 空闲线程存活时间:当线程数大于核心线程数时,空余线程等待新任务的最长时间。 
- unit 空闲线程存活时间单位 
- workQueue 工作队列 
- threadFactory 线程工厂:创建线程使用的工厂,可以用来指定线程名字。 
- handler 拒绝策略 
工作队列:有四种
- ArrayBlockingQueue:基于数组的有界阻塞队列,FIFO。 
- LinkedBlockingQuene:基于链表的无界阻塞队列,FIFO。如果指定长度可以充当有界队列,不指定长度则默认Interger.MAX,相当于是无界的。 
- SynchronousQuene:不缓存任务的阻塞队列,相当于没有队列。 
- PriorityBlockingQueue:具有优先级的无界阻塞队列。 
拒绝策略:工作队列无法加入新任务,且线程数量达到最大线程数,则采用拒绝策略。也有四种
- AbortPolicy:默认策略,直接丢弃任务,并且抛出异常。 
- CallerRunsPolicy:调用者直接执行拒绝任务的run方法。 
- DiscardPolicy:直接丢弃任务,啥都不做。 
- DiscardOldestPolicy:抛弃队列中最早的任务,并将当前任务放入队列。 
线程池最多能同时处理多少个任务?
如果工作队列是有界队列,则最多:工作队列长度+最大线程数;如果工作队列是无界队列,则最多是无限个。
Executors工具类有哪几种构造线程池的方法?
- newFixedThreadPool:创建固定大小的线程池。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。 
- newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。 
- newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。 
- newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。 
- newSingleThreadScheduledExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。 
JVM中哪些区域线程共享,哪些线程私有?
- 线程共享:方法区、堆 
- 线程私有:Java栈、本地方法栈、程序计数器 

[
Java到底是引用传递还是值传递
2020-08-07

[
数据库索引
2020-08-02

[
事务:不好意思,你被隔离了!
2020-07-23

[
spring事务咋和新冠病毒一样,还会传染?
2020-07-05

[
数据是怎么一步一步到服务器的
2020-06-18

本文分享自微信公众号 - pipi蛋(pipidan_fuyun)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
 
  
  
  
 
 
  
 
 
 