多线程
线程创建
1、自定义类继承Thread,重写run
Thread t=new 自定义类();
t.start();//jvm会调用t的run方法,同时当前线程会返回调用处,继续往下执行
2、实现Runnable ,实现run()
Thread t=new Thread(new MyRunnable());
t.start();
区别:
1、特点:单继承的局限,简单
2、特点:多实现,侵入性低,可以实现资源共享
线程的状态
线程的调度
如何分配CPU时间片---机制
1、优先级 :一个线程抢占到CPU的概率
可以设置1-10之间的整数,1最低,10最高,5默认值
2、线程休眠
static void sleep(long millis)
所在线程会处于休眠,休眠时间millis毫秒
可能引发InterruptedException中断异常
使用场景:主要是来模拟线程的任务消耗的时间,强制程序减慢速度
3、join插队
void join() 插队,一直执行完
void join(long millis) 插队一定的时间
谁调用,谁插队。
可能引发InterruptedException中断异常
4、yield礼让
static void yield() 所在线程礼让
放弃本次抢占到的CPU,重新再来抢。可能礼让成功,也可能礼让不成功
案例:
模拟医院叫号
50个普通号
10个专家号
专家号 时间是普通号的2倍
专家号 的优先级高
当普通号看到10号的时候,把所有的所有的专家号看完再看普通号
主线程--普通号
子线程--专家号
线程同步
火车站买票
多个窗口卖票
票数量ticket
多个窗口用多个线程来模拟
任务---run()
多线程资源共享可能会出现以下问题:
* 1、同一张票由多个窗口卖
* 2、有些票没有1个窗口在卖
原因:读写不一致。
某个线程读的数据不是自己曾经写的。自己写的可能被别人读取了。
解决方案:
同步代码块
Synchronized(对象锁){
代码块
}
拥有锁,才能执行代码块。代码块执行完,就会释放锁。别的线程就可以继续获取锁
对象锁:每一个对象都有一把锁
同步方法
synchronized void sell(){}
默认使用的是this这把锁
区别:
1、同步方法可以重用,同步代码块比较灵活
2、当一个线程在访问同步方法时,其它的线程无法访问所有的同步方法
3、同步代码块可以嵌套定义
同步的特点:好处:实现资源共享的读写一致
缺点:效率低
同步相关类:线程安全-(多线程下访问数据是一致的)
* StringBuilder 不是线程安全,效率高,适合用在单线程
* StringBuffer 线程安全,效率低,适合用在多线程
* ArrayList不是线程安全,效率高,适合用在单线程
* Vector 线程安全
* Hashtable 线程安全
* HashMap 不是线程安全
死锁
对方彼此拥有着对方想要的锁,还在等待对方释放人家的锁
小明 拥有小汽车
小花 拥有洋娃娃
小明:你把你的洋娃娃给我,我就把我的小汽车给你
小花:你把你的小汽车给我,我就把我的洋娃娃给你
程序:卡死
原因:同步嵌套
同步嵌套会引发死锁,但不是一定会死锁。
编程中尽量避免同步嵌套。
A-->B B--->C C-->A
生产者和消费者的问题
先生产再消费,消费则生产,生产完就消费
生产--消费--生产--消费
Object
wait()当前线程等待
notify() 唤醒等待单个线程
notifyAll();唤醒等待的所有线程。
线程池
1、线程池存储一些线程对象,减少线程的创建和销毁,让程序员更专业任务。
2、定时、定期的启动线程
线程池怎么用?
java.util.concurrent
Executor
执行已提交的 Runnable 任务的对象
子接口ExecutorService :管理终止的方法
类ThreadPoolExecutor
ScheduledExecutorService:安排在给定的延迟后运行或定期执行的命令
ScheduledThreadPoolExecutor
Executors
newFixedThreadPool(int nThreads) 创建固定数量的线程池
newSingleThreadExecutor()创建单线程池
newCachedThreadPool()创建可缓存的线程池
newScheduledThreadPool(int corePoolSize)创建可定期执行的线程池对象
可自定义配置线程池对象
ThreadPoolExecutor
int corePoolSize,核心线程数
int maximumPoolSize,最大线程数
long keepAliveTime,最大活跃时间
TimeUnit unit,最大活跃时间的单位
BlockingQueue<Runnable> workQueue,阻塞队列
ThreadFactory threadFactory, 线程工厂,创建线程对象
RejectedExecutionHandler handler 拒绝执行策略