美文网首页
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