线程创建的三种方法
1.继承Thread类 重写run方法
2.实现Runnable接口 (此方法较为常用)
重写run方
3.实现Callable接口
重写Callable方法,需要定义一个返回值
线程的常用方法
1 sleep 使线程延迟 但并不会释放锁
3
2线程礼让 yield 但并不一定会成功
3.线程强制执行 join 可以理解为插队
4.观测线程状态State
线程状态。 线程可以处于以下状态之一:
NEW
尚未启动的线程处于此状态。
RUNNABLE
在Java虚拟机中执行的线程处于此状态。
BLOCKED
被阻塞等待监视器锁定的线程处于此状态。
WAITING
正在等待另一个线程执行特定动作的线程处于此状态。
TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
TERMINATED
已退出的线程处于此状态。
5 线程的优先级priorite
可改变线程的优先级(1~10)
6守护线程demon
静态代理模式
Lamda表达式的应用及其推导过程
推导过程 (省略的方式)
三大不安全案例(使用synchronized后可变为安全)图为已使用
1买票案例
2.银行取钱案例
3.线程
但是要小心形成死锁
lock锁
生产消费者问题
1管程法
2信号灯法(类似红绿灯)
线程池的创建及使用
背景: 经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。
思路: 提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。
好处:
提高响应速度(减少了创建新线程的时间)
降低资源消耗(重复利用线程池中线程,不需要每次都创建)便于线程管理(....)
corePoolSize:核心池的大小maximumPoolSize:最大线程数
keepAliveTime:线程没有任务时最多保持多长时间后会终止
多线程总结及回顾