Java多线程
一、线程创建方法
- 继承Tread类
- 实现Runable接口
- 使用ExcutorSerivice和Callable实现有返回值的线程,返回值保存在Future对象中
- 基于线程池创建线程
二、线程池工作原理
线程池的主要作用:线程复用、线程管理、控制最大并发数。
-
线程复用:Thread类中的start方法中不断循环调用传递进来的Runable对象,而将这些对象存储到Queue中,每次循环调用Queue中的对象,即能实现复用。
-
线程池的核心组件关系如下:
-
线程池工作过程如下(新线程流入步骤):
-
线程池的拒绝策略:AbortPolicy(直接抛异常)、CallerRunsPolicy(被丢弃的线程任务未关闭,则先执行)、DiscardOldestPolicy(移除线程池中最早的一个线程任务)、DiscardPolicy(丢弃当前的线程任务不做处理)、自定义
三、常用的五种线程池
- Executor.newCachedThreadPool
- Executor.newFixedThreadPool
- Executor.newScheduledThreadPool
- Executor.newSingleThreadPool
- Executor.newWorkStealingPool
四、线程的生命周期
五种状态:new、runable、running、block、dead
转化状态如下:
五、线程的基本方法
- wait:调用wait方法会释放锁,等到被通知或被中断后才会返回,线程进入WAITING状态
- sleep:不会释放当前拥有的锁,线程进入TIME-WAITING状态
- yield:线程让出时间片,进入就绪状态,竞争CPU时间片
- interrupt:不会中断一个正在运行的线程,处于running状态的线程不会因为调用了interrupt方法而终止
- join:等待其他线程终止,若当前线程中调用一个线程的join方法,则当前线程转为阻塞状态,等到另一个线程结束,改线程转为就绪状态竞争CPU资源
- notify:唤醒对象监视器上等待的一个线程(随机唤醒一个等待的线程)
- setDaemon:定义守护线程,为用户线程提供公共服务,可自动离开。如垃圾回收线程
不同方法对线程状态的影响如下:
六、终止线程的方法
- 正常运行结束
- 使用退出标志退出线程
- 使用interrupt方法终止线程(更改中断标志)
- 使用stop方法终止线程(不安全)