多线程

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
  • 简化编程模型
    线程之间能否共享数据
    堆里的对象是公用的
    栈里的不公用

创建线程

  1. 继承Threead 任务不同用
    通过继承线程对象,实现里面的run方法
    创建线程对象
    通过start()启动线程
    start()
  2. 实现Runnable 任务相同用,一般用这个
    通过new Thread(thread).start()

线程的调度

setPriority()设置线程优先级(1~10)
sleep() 线程休眠 释放cpu 不释放锁
yield() 礼让
join() 必须优先把加入的线程任务执行完才会执行其余线程
interrupt() 中断 将isInterrupt() 变为true
isInterrupt() 通过当前线程获取后判断是否自己死掉
setDaemon(true) 其他线程都完了,最后退出

继承和实现接口

实现接口好处:
避免单继承

  1. 实现Callable<>接口
    实现call()方法
    能抛异常,声明异常,有返回值
    需转化为Runnable
    通过FutureTask<>接口转换

线程安全问题

数据共享是产生

线程同步

synchronize
同步代码块

同步方法:当前对象
Lock lock = new Lock
lock.lock()
代码块
lock.unlock()
不随意加锁,和效率相背而驰

死锁

多个资源互斥,一个线程拿到A资源并且要等B资源,另一个线性拿着B资源等A资源。

重写规则

重写父类没抛异常,子类也不能抛

ArrayList 线程不安全
CopyOnWriteArrayList 安全

线程池

将任务交给线程池执行
什么是线程池
线程池的重要性
execute(Runnable) 执行

参数

corePollSize 核心线程数

  1. cpu密集型:cpu核数的2倍
  2. IO密集型:倍数可以放大
  • 2.1 cpu乘(等待时间除以计算时间)
    maxPoolSize 最大线程
    KeepAliceTime 存活时间
    unit 时间单位
    WorkQueue 任务存储队列
    ThreadFactory 自定义创建线程
    Handler 无法接收时拒接策略
  1. new ThreadPoolExecutor.AbortPolicy()
    丢弃任务并抛异常
  2. 丢弃
  3. 丢弃第一个排队的,做最新的。不抛异常。可以按时间排序
  4. 多余的交给调用者(主线程)

线程工具类(Executors)

  1. newSIngleThreadExecutor():单个线程池
  2. newFixedThreadPool(10):固定线程池
  3. newCachedThreadPool():带缓存的线程池
  4. ScheduledThreadPool():延时重复

关闭线程

shutdown() 执行完当前任务关闭
shutDownNow() 立即关闭,将没执行完的任务打包作为集合返回给调用者.

posted @ 2022-07-18 20:04  chahune  阅读(42)  评论(0)    收藏  举报