多线程2
多线程
一个进程里面有多个线程,多线程程序
一个线程就是一个任务==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():延时重复
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() 获取文件夹下所有文件

浙公网安备 33010602011771号