文章目录
多线程
定义
多线程定义:可以让程序同时做多件事情
作用
多线程作用:提高程序效率,发挥多核CPU 的优势
应用场景
多线程应用场景:只要想让多个事情同时运行就需要用到多线程
线程
线程:应用软件中互相独立,可以同时运行的功能
并发
并发:在同一时刻,有多个指令在单个CPU上交替执行
并行
并行:在同一时刻,有多个指令在单个CPU上同时执行
start(启动线程)
start:调用start()方法表现出多线程的特性
run(启动线程)
调用 run()方法,代码还是同步执行的,但等待一个线程的 run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其 run()方法里面的代码。
线程声明周期状态
NEW:线程刚创建还没有启动
Runnable:线程以触发start方法,正常运行状态
Blocked:线程阻塞,等待获取到锁,获取到进入Runnable状态继续运行
Waiting:表示线程处于无效等待状态,如果是wait()方法设置等待,那么就通过notifyAll()方法唤醒,唤醒后进入Runnable状态继续运行
Timed_waiting:表示线程进入到有限时间等待,不如sleep(3),等待3秒后线程继续运行,进入Runnable状态继续运行
Terminated:线程执行完后,进入终止状态
wait()和sleep区别
sleep和 wait 方法都可以放弃 CPU 一定的时间,不同的是如果线程持有某个对象的监视器,sleep 方法不会放弃这个对象的监视器,wait 方法会放弃这个对象的监视器(sleep在指定时间结束后自动继续执行线程,而wait需要等待唤醒)
多线程同步方法
Synchronized 关键字和Lock 锁实现,分布式锁等
死锁
死锁就是两个线程相互等待对方释放对象锁。
多线程如何进行通信
wait/notify
守护线程
setDaemon():设置守护线程
当其它线程执行完毕之后,守护线程会陆续结束
礼让线程
yield():设置礼让线程
礼让线程:暂停当前正常执行的线程对象,让其他有相同优先级的线程执行
插入线程
join():设置插入线程
A线程设置为插入线程后,当A线程执行完毕后,B线程在开始执行
阻塞队列
创建ArrayBlockingQueue对象进行实现
当前线程执行完后才进行退出
notify和notity区别
notityAll:唤醒当前锁对象中的线程
notity:单个线程唤醒时会使用到