多线程
JavaEE2206方在良 给您发送了 1 个文件(夹),请在右侧接收.时间 19:59:21.
文件 day21.xmind 接收完成,保存路径: “G:\千锋培训\2206\java一阶段\课程\20220718-day21-多线程2\day21.xmind”。
打开文件 打开所在文件夹 删除 永久删除
文件全部接收完成。总共大小: 241KB 平均速度:616KB/s 费时:0.39秒 共1个文件:day21.xmind
javaEE-2206-何川 20:02:31
多线程
一个进程里面有多个线程,多线程程序
一个线程就是一个任务==run方法
一个线程对象只能启动一次,运行结束后死亡
为什么多线程?
- 快,合理利用cpu,压榨cpu
- 简化编程模型
线程之间能否共享数据
堆里的对象是公用的
栈里的不公用
创建线程
- 继承Threead 任务不同用
通过继承线程对象,实现里面的run方法
创建线程对象
通过start()启动线程
start() - 实现Runnable 任务相同用,一般用这个
通过new Thread(thread).start()
线程的调度
setPriority()设置线程优先级(1~10)
sleep() 线程休眠 释放cpu 不释放锁
yield() 礼让
join() 必须优先把加入的线程任务执行完才会执行其余线程
interrupt() 中断 将isInterrupt() 变为true
isInterrupt() 通过当前线程获取后判断是否自己死掉
setDaemon(true) 其他线程都完了,最后退出
继承和实现接口
实现接口好处:
避免单继承
- 实现Callable<>接口
实现call()方法
能抛异常,声明异常,有返回值
需转化为Runnable
通过FutureTask<>接口转换
线程安全问题
数据共享是产生
线程同步
synchronize
同步代码块
同步方法:当前对象
Lock lock = new Lock
lock.lock()
代码块
lock.unlock()
不随意加锁,和效率相背而驰
死锁
多个资源互斥,一个线程拿到A资源并且要等B资源,另一个线性拿着B资源等A资源。
重写规则
重写父类没抛异常,子类也不能抛
ArrayList 线程不安全
CopyOnWriteArrayList 安全
线程池
将任务交给线程池执行
什么是线程池
线程池的重要性
execute(Runnable) 执行
参数
corePollSize 核心线程数
- cpu密集型:cpu核数的2倍
- IO密集型:倍数可以放大
- 2.1 cpu乘(等待时间除以计算时间)
maxPoolSize 最大线程
KeepAliceTime 存活时间
unit 时间单位
WorkQueue 任务存储队列
ThreadFactory 自定义创建线程
Handler 无法接收时拒接策略
- new ThreadPoolExecutor.AbortPolicy()
丢弃任务并抛异常 - 丢弃
- 丢弃第一个排队的,做最新的。不抛异常。可以按时间排序
- 多余的交给调用者(主线程)
线程工具类(Executors)
- newSIngleThreadExecutor():单个线程池
- newFixedThreadPool(10):固定线程池
- newCachedThreadPool():带缓存的线程池
- ScheduledThreadPool():延时重复
关闭线程
shutdown() 执行完当前任务关闭
shutDownNow() 立即关闭,将没执行完的任务打包作为集合返回给调用者.