线程概述
线程是进程执行的基本单元。本质是占用cpu单独执行的操作。
并行是指同一时刻程序同时进行。本质上是指不同的代码块同时执行。
并发是指交替做不同事情的能力。本质上是cpu交替运行不同的代码块。
什么时候出现线程问题,什么情况下会产生并发? 答:多个线程访问同一个资源而出现的竞争现象。
守护线程:专门用于服务其他的线程,如果其他的线程(即用户自定义线程)都执行完毕,连main线程也执行完毕,那么jvm就会退出(即停止运行)——此时,连jvm都停止运行了,守护线程当然也就停止执行了。JVM中的垃圾回收器GC就是一个守护线程。
线程的五种创建方式
1.继承Thread,重写run方法。
Thread2.实现Runnable接口,实现run方法
Runnable3.Callable方式,可以有返回值
Callable4.线程池创建线程 ,线程池资源地址 , excute和submit区别
创建线程池。线程的基本用法
join的用法
join 当前线程暂停,等待指定线程执行结束后,当前线程再继续。自动调用wait,让父线程停止。等待t1执行完成后,再继续执行t12,达到插入作用。
join(int) 可以等待指定毫秒之后继续。加入父线程只加入10毫秒,随后退出。
synchronized的用法
synchronized (this){ //this 需要慎重使用,使用同一个对象可以用this。 有可能导致锁的不唯一。
synchronized (CommonUtilsIncrement.class) 推荐使用。
1.8 synchronized自适应自旋锁 隐式锁
自旋锁:抢不到就一直去抢锁,抢了一会休息一会(线程等待池),等到再次发生唤醒信号,又来忙碌的抢锁,直到抢到锁为止。(一直处于忙碌状态,耗时多)。
互斥锁:先抢锁,若抢不到就不抢了,直接进入线程等待池,等待被唤醒。若抢到了,则会持有锁,运行程序。
1.5 ReentrantLock 显示锁:可以跨代码块锁,使用信号量来控制。(公平锁true、非公平锁false)
Condition c1 = reentrantLock.newCondition();
conditionQ.signal();//指定唤醒 conditionQ 信号量
conditionM.await();//进入线程等待池。
yield的用法
礼让线程,让出cpu的执行权。setPriority()设置线程的优先级(增大CPU给他执行权的概率)
同步代码块
1.什么情况下需要同步
当多线程并发,有多段代码同时执行时,我们希望某段代码执行过程中CUP不要切换到其他线程工作,这时就需要同步。
如果两段代码是同步的,那么同一时间只能执行一段,在一段代码没执行结束之前,不会执行另一个代码。
2.线程通信
线程通信是指管理线程执行顺序。
配合synchronized来使用,wait():等待(在线程等待池,释放锁)。notify():唤醒(随机在线程等待池中唤醒一个线程)。
this.notify();// 随机唤醒线程等待池中的任意线程(若线程池等待池中没有线程,则会空唤醒) ,在哪里等待就在哪里唤醒。
this.notifyAll();// 随机唤醒线程等待池中的所有线程(若线程池等待池中没有线程,则会空唤醒) ,在哪里等待就在哪里唤醒。
线程的执行顺序需要第三方变量控制。
死锁:所有线程都处于等待卡死状态。
网友评论