多线程2

多线程

一个进程里面有多个线程,多线程程序
一个线程就是一个任务==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():延时重复

ThreadLocal

根据线程数new对象,节约空间
-- tl = new ThreadLocal<>(){
重写initVal,返回对象
}
通过tl.get()获取一个对象调用

关闭线程

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

一个类如果没有成员变量

生产者和消费者

wait
noailty
noailyAll

文件操作

File file = new File(path);
file.createNerFile():创建文件
file.exists():是否存在
file.length():长度
file.delete():删除
file.getAbsolutePath():绝对路径
file.getPath():相对路径
file.getName() 获取文件名
file.separator 文件分隔符
文件夹
file.mkdir():创建文件夹
file.mkdirs():创建文件夹
file.isFile():是不是文件
file.isDirectory():是不是文件夹

file.list() 获取文件夹下所有文件名字
file.listFiles() 获取文件夹下所有文件

posted @ 2022-07-18 20:05  yishizhengbianren  阅读(66)  评论(0)    收藏  举报