美文网首页
java线程实现的方式

java线程实现的方式

作者: 杨斌_1024 | 来源:发表于2020-08-12 21:58 被阅读0次

线程概述

线程是进程执行的基本单元。本质是占用cpu单独执行的操作。

并行是指同一时刻程序同时进行。本质上是指不同的代码块同时执行。

并发是指交替做不同事情的能力。本质上是cpu交替运行不同的代码块。

什么时候出现线程问题,什么情况下会产生并发? 答:多个线程访问同一个资源而出现的竞争现象。

守护线程:专门用于服务其他的线程,如果其他的线程(即用户自定义线程)都执行完毕,连main线程也执行完毕,那么jvm就会退出(即停止运行)——此时,连jvm都停止运行了,守护线程当然也就停止执行了。JVM中的垃圾回收器GC就是一个守护线程。

线程的五种创建方式

1.继承Thread,重写run方法。

Thread

2.实现Runnable接口,实现run方法

Runnable

3.Callable方式,可以有返回值

Callable

4.线程池创建线程 ,线程池资源地址  , 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();// 随机唤醒线程等待池中的所有线程(若线程池等待池中没有线程,则会空唤醒) ,在哪里等待就在哪里唤醒。

线程的执行顺序需要第三方变量控制。

死锁:所有线程都处于等待卡死状态。

相关文章

网友评论

      本文标题:java线程实现的方式

      本文链接:https://www.haomeiwen.com/subject/jwpfwhtx.html