JAVA 多线程及线程池
- https://www.liaoxuefeng.com/article/895890199934208
- 线程是进程中的最小的执行单元,也可理解成一个进程里独立运行的子任务;一个进程可包含多个线程,线程比进程耗费更少资源;进程代表一个应用,操作系统中的一个执行单元;
- 多线程即一个进程中运行多个具有相同执行逻辑的单元;
- 并行:多个cpu或多台机器同时执行一段处理逻辑,真正的同时;parellel -> two queues and two coffemacines
- 并发:通过cpu的调度算法,用户看上去同时,但在cpu的操作层面不是真正的同时,涉及资源共享和阻塞;concurrent -> two queues and one coffemachine;
- 线程不安全就意味着线程的调度顺序会影响最终结果;如果调度顺序不影响执行结果,则只需要考虑cpu和内存是不是够用;
- Runnable状态表示线程处在调度的状态(JVM调度),一旦获取CPU资源,就会进入Running状态;
- Running状态可能由于执行sleep()或join(),变成blocked状态,一旦sleep时间结束,或join中断,则进入Runnable等待调度;
- Running状态可由于synchronized锁住(进入lock blocked pool),变成lock blocked状态,一旦锁释放,进入Runnable等待调度;
- Running状态可先由synchronized锁住,然后调用wait(进入wait blocked pool),再调用nofity/nofityAll,线程被放入lock blocked pool,一旦锁释放,进入Runnable等待调度;
- Running状态也可直接调用yield,进入Runnable状态;
- http://www.voidcn.com/article/p-rizvqpxu-bam.html
-
- ThreadPoolExecutor继承抽象类AbstractExecutorService,该类实现了两个interface:ExecutorService(子)和Executor(父);
- 构建ThreadPoolExecutor时,需要如下参数:
- corePoolSize: 线程池维护线程的最少数量
- maximumPoolSize:线程池维护线程的最大数量
- keepAliveTime: 线程池维护线程所允许的空闲时间
- unit: 线程池维护线程所允许的空闲时间的单位
- workQueue: 线程池所使用的缓冲队列
- handler: 线程池对拒绝任务的处理策略
- 创建线程方式:
- 4种处理策略: