精华内容
下载资源
问答
  • 查了资料如下: ...从资料上看,等待涉及到线程间的协作唤醒,其他的基本差不多,是不是线程等待和线程阻塞仅仅是逻辑上的不同? 线程等待和线程阻塞都是不占用cpu的,那么它们的底层实现一样吗?
  • 二、线程阻塞BLOCKED和等待WAITING的区别 阻塞BLOCKED 等待WAITING 不知羞耻的摘录 一、 sleep()wait()方法的区别 sleep()方法 sleep()方法是Thread类的方法,通过其定义可知是个native方法,在指定的时间...

    目录

     

    一、 sleep()和wait()方法的区别

    sleep()方法

    wait()方法

    区别

    二、线程阻塞BLOCKED和等待WAITING的区别

    阻塞BLOCKED

    等待WAITING

    不知羞耻的摘录


    一、 sleep()和wait()方法的区别

    sleep()方法

    sleep()方法是Thread类的方法,通过其定义可知是个native方法,在指定的时间内阻塞线程的执行。而且从其注释中可知,并不会失去对任何监视器(monitors)的所有权,也就是说不会释放锁,仅仅会让出cpu的执行权。如下图所示

    wait()方法

    wait()方式是基类Object的方法,其实也是个native方法

    不管是wait()还是wait(long timeout, int nanos),其调用的都是wait(long timeout)

    The current thread must own this object's monitor

    根据注释中的一句话,可以看出此方法调用的前提是当前线程已经获取了对象监视器monitor的所有权。 

    该方法会调用后不仅会让出cpu的执行权,还会释放锁(即monitor的所有权),并且进入wait set中,知道其他线程调用notify()或者notifyall()方法,或者指定的timeout到了,才会从wait set中出来,并重新竞争锁。

    区别

    最主要的区别就是释放锁(monitor的所有权)与否,但是两个方法都会抛出InterruptedException。

    二、线程阻塞BLOCKED和等待WAITING的区别

    阻塞BLOCKED

    阻塞表示线程在等待对象的monitor锁,试图通过synchronized去获取某个锁,但是此时其他线程已经独占了monitor锁,那么当前线程就会进入等待状态。

    等待WAITING

    当前线程等待其他线程执行某些操作,典型场景就是生产者消费者模式,在任务条件不满足时,等待其他线程的操作从而使得条件满足。可以通过wait()方法或者Thread.join()方法都会使线程进入等待状态。

    不知羞耻的摘录

    实际上不用可以区分两者, 因为两者都会暂停线程的执行. 两者的区别是: 进入waiting状态是线程主动的, 而进入blocked状态是被动的. 更进一步的说, 进入blocked状态是在同步(synchronized代码之外), 而进入waiting状态是在同步代码之内.(摘自csdn论坛中很好解答)

     

    展开全文
  • JAVA 线程状态 阻塞和等待 bloked waiting 区别 NEW A thread that has not yet started is in this state. 一个被创建的线程,但是还没有调用start方法 一个正在被执行的线程的状态 RUNNABLE A thread ...

    JAVA 线程状态 阻塞和等待 bloked 和 waiting 区别

    NEW

    A thread that has not yet started is in this state.

    一个被创建的线程,但是还没有调用start方法

    RUNNABLE

    A thread executing in the Java virtual machine is in this state.

    一个正在被执行的线程的状态

    BLOCKED

    A thread that is blocked waiting for a monitor lock is in this state.

    一个线程因为等待临界区的锁被阻塞产生的状态
    Lock 或者synchronize 关键字产生的状态

    WAITING

    A thread that is waiting indefinitely for another thread to perform a
    particular action is in this state.

    一个线程进入了锁,但是需要等待其他线程执行某些操作。时间不确定
    当wait,join,park方法调用时,进入waiting状态。前提是这个线程已经拥有锁了。

    TIMED_WAITING

    A thread that is waiting for another thread to perform an action for
    up to a specified waiting time is in this state.

    一个线程进入了锁,但是需要等待其他线程执行某些操作。时间确定
    通过sleep或wait timeout方法进入的限期等待的状态)

    TERMINATED

    A thread that has exited is in this state.

    退出

    原文地址:https://my.oschina.net/payzheng/blog/692635

    展开全文
  • 线程等待另外一个线程通知调度器的一个条件的时候,它自己进入等待状态。在调用Object.wait()或Thread.join()方法,或者等待java.util.concurrent库中的Lock或Condition时,会出现等待状况。 转载于:htt...

    当线程试图获取一个内部的对象锁(不是java.util.concurrent库中的锁),而锁被其它线程占有,则该线程进入阻塞状态。

     

    当线程等待另外一个线程通知调度器的一个条件的时候,它自己进入等待状态。在调用Object.wait()或Thread.join()方法,或者等待java.util.concurrent库中的Lock或Condition时,会出现等待状况。

     

    转载于:https://www.cnblogs.com/phoebus0501/archive/2010/11/21/1883063.html

    展开全文
  • 5、线程的创建启动  C、用线程对象的start方法启动线程  A、继承Thread类或实现Runnable接口,重写或实现run方法,run方法代表线程要完成的任务  B、创建Thread子类或是Runnable的实现类,即创建的线程...

    5、线程的创建和启动

        C、用线程对象的start方法启动线程
        A、继承Thread类或实现Runnable接口,重写或实现run方法,run方法代表线程要完成的任务

        B、创建Thread子类或是Runnable的实现类,即创建的线程对象;不同的是接口实现线程,

            需要将接口的实现类作为参数传递给Thread类的构造参数

     

    6、继承Thread和实现Runnable接口创建线程的区别

        采用Runnable接口实现线程:

        优势:

            A、线程类只是实现了Runnable接口,还可以继承其他的类

            B、在这种方式下,可以多个线程共享同一个目标对象,所以很合适多个线程来处理同一份资源的情况,

                从而可以将CPU、代码和数据分开,形成清晰的模型,较好的面相对象思想。

        劣势:编程稍微复杂,如果需要访问当前线程需要用Thread.currentThread方法来获取

     

        采用继承Thread类的方式实现线程:

        优势:编写简单,如果要获得当前线程直接this即可

        劣势:线程类继承了Thread,不能在继承其他类

        相对而言,用Runnable的方式更好,具体可以根据当前需要而定;

     

    7、线程生命周期

        线程被创建启动后,不并不是启动后就进入了执行状态,也不是一直处于的执行状态。

        线程的生命周期分为创建(new)、就绪(Runnable)、运行(running)、阻塞(Blocked)、死亡(Dead)五种状态。

        线程启动后不会一直霸占CPU资源,所以CPU需要在多条线程中切换执行,线程就会在多次的运行和阻塞中切换。

     

    8、新建(new)和就绪(Runnable)状态

        当new一个线程后,该线程处于新建状态,此时它和Java对象一样,仅仅由Java虚拟机为其分配内存空间,并初始化成员变量。

        此时线程对象没有表现出任何的动态特征,程序也不会执行线程的执行体。

        注意:run方法是线程的执行体,不能由我们手动调用。我们可以用start方法启动线程,系统会把run方法当成线程的执行体来运行,

        如果直接调用线程对象run方法,则run方法立即会被运行。而且在run方法返回之前其他线程无法并行执行,

        也就是说系统会把当前线程类当成一个普通的Java对象,而run方法也是一个普通的方法,而不是线程的执行体。

     

    9、运行(running)和阻塞(Blocked)状态

        如果处于就绪状态的线程就获得了CPU,开始执行run方法的线程执行体,则该线程处于运行状态。

        单CPU的机器,任何时刻只有一条线程处于运行状态。当然,在多CPU机器上将会有多线程并行(parallel)执行,

        当线程大于CPU数量时,依然会在同一个CPU上切换执行。

        线程运行机制:一个线程运行后,它不可能一直处于运行状态(除非它执行的时间很短,瞬间执行完成),线程在运行过程中需要中断,

        目的是让其他的线程有运行机会,线程的调度取决于底层的策略。对应抢占式的系统而言,系统会给每个可执行的线程一个小时间段来处理任务,

        当时间段到达系统就会剥夺该线程的资源,让其他的线程有运行的机会。在选择下一个线程时,系统会考虑线程优先级。

        以下情况会出现线程阻塞状态:

            A、线程调用sleep方法,主动放弃占用的处理器资源

            B、线程调用了阻塞式IO方法,在该方法返回前,该线程被阻塞

            C、线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有。

            D、线程等待某个通知(notify)

            E、程序调用了suspend方法将该线程挂起。不过这个方法容易导致死锁,尽量不免使用该方法

        当线程被阻塞后,其他线程将有机会执行。被阻塞的线程会在合适的时候重新进入就绪状态,注意是就绪状态不是运行状态。

        也就是被阻塞线程在阻塞解除后,必须重新等待线程调度器再次调用它。

        针对上面线程阻塞的情况,发生以下特定的情况可以解除阻塞,让进程进入就绪状态:

            A、调用sleep方法的经过了指定的休眠时间

            B、线程调用的阻塞IO已经返回,阻塞方法执行完毕

            C、线程成功获得了试图同步的监视器

            D、线程正在等待某个通知,其他线程发出了通知

            E、处于挂起状态的线程调用了resume恢复方法

        线程从阻塞状态只能进入就绪状态,无法进入运行状态。而就绪和运行状态之间的转换通常不受程序控制,而是由系统调度所致的。

        当就绪状态的线程获得资源时,该线程进入运行状态;当运行状态的线程事情处理器资源时就进入了就绪状态。

        但对调用了yield的方法就例外,此方法可以让运行状态转入就绪状态。

     

    10、线程死亡(Dead)状态

        线程会在以下方式进入死亡状态:

        A、run方法执行完成,线程正常结束

        B、线程抛出未捕获的异常或Error

        C、直接调用该线程的stop方法来结束线程—该方法易导致死锁,注意使用

        注意:当主线程结束的时候,其他线程不受任何影响。一旦子线程启动后,会拥有和主线程相同的地位,不受主线程影响。

        isAlive方法可以测试当前线程是否死亡,当线程处于就绪、运行、阻塞状态,该方法返回true,如果线程处于新建或死亡状态就会返回false。

        不要试图对死亡的线程调用start方法,来启动它。死亡线程不可能再次运行。

     

    11、控制线程

        Java线程提供了很多工具方法,这些方法都很好的控制线程

        A、join线程

            让一个线程等待另一个线程完成的方法。当某个程序执行流中调用其他线程的join方法时,调用线程将会被阻塞,直到被join方法的join线程执行完成为止。

            join方法通常有使用线程的程序调用,将大问题划分成许多小问题。每个小问题分配一个线程。当所有的小问题得到处理后,再调用主线程进一步操作。

            join有三种重载模式:

                一、join等待被join的线程执行完成

                二、join(long millis)等待被join的线程时间最长为millis毫秒,如果在millis毫秒外,被join的线程还没有执行完则不再等待

                三、join(long millis, int nanos)被join的线程等待时间长为millis毫秒加上nanos微秒

            通常我们很少用第三种join,原因有二:程序对时间的精度无需精确到千分之一毫秒

            计算机硬件、操作系统也无法做到精确到千分之一毫秒

     

        B、后台线程

            有一种线程,在后台运行,它的任务是为其他线程提供服务,这种线程被称为“后台线程(Daemon Thread)”,有被称为“守护线程”或“精灵线程”。

            JVM的垃圾回收器线程就是后台进程。

            后台进程有个特征是:如果前台的进程都死亡,那么后台进程也死亡。(它为前台进程服务)

            用Thread的setDaemon (true)方法可以指定当前线程为后台线程。

            注意:前台线程执行完成死亡后,JVM会通知后台线程,后台线程就会死亡。但它得到通知到后台线程作成响应,需要一段时间,

            而且要将某个线程设置为后台线程,必需要在该线程启动前设置,也就是说设置setDaemon必需在start方法前面调用。

            否则会出现java.lang.IllegalThreadStateException异常

     

        C、线程休眠sleep

            如果需要当前线程暂停一段时间,并进入阻塞状态就需要用sleep,sleep有2中重载方式:

            sleep(long millis)让当前线程暂停millis毫秒后,并进入阻塞状态,该方法受系统计时器和线程调度器的影响

            sleep(long millis, int nanos)让当前正在执行的线程暂停millis毫秒+nanos微秒,并进入阻塞

            当调用sleep方法进入阻塞状态后,在sleep时间段内,该线程不会获得执行机会,即使没有其他可运行的线程,处于sleep的线程不会执行。

     

        D、线程让步yield

            yield和sleep有点类似,它也可以让当前执行的线程暂停,但它不会阻塞线程,只是将该线程转入到就绪状态。

            yield只是让当前线程暂停下,让系统线程调度器重新调度下。

            当yield的线程后,当前线程暂停。系统线程调度器会让优先级相同或是更高的线程运行。

     

            sleep和yield的区别

                (1)、sleep方法暂停当前线程后,会给其他线程执行集合,不会理会线程的优先级。但yield则会给优先级相同或高优先级的线程执行机会

                (2)、sleep方法会将线程转入阻塞状态,直到经过阻塞时间才会转入到就绪状态;而yield则不会将线程转入到阻塞状态,它只是强制当前线程进入就绪状态。

                        因此完全有可能调用yield方法暂停之后,立即再次获得处理器资源继续运行。

                (3)、sleep声明抛出了InterruptedException异常,所以调用sleep方法时,要么捕获异常,要么抛出异常。而yield没有申明抛出任何异常

     

        E、改变线程优先级

            每个线程都有优先级,优先级决定线程的运行机会的多少。

            每个线程默认和它创建的父类的优先级相同,main方法的优先级是普通优先级,那在main方法中创建的子线程都是普通优先级。

            getPriority(int newPriority)/setPriority(int)

            设置优先级有以下级别:

                MAX_PRIORITY 值是10

                MIN_PRIORITY 值是1

                NORM_PRIORITY 值是5

                范围是1-10;



    http://blog.sina.com.cn/s/blog_a2dce6b301015vj1.html



    展开全文
  • 线程休眠和阻塞区别

    千次阅读 2020-09-04 17:04:35
    经常会有人问线程(或者进程)休眠和阻塞区别,挂起和阻塞区别。个人决定不同的操作系统,会有不同的差异。本文做一个思路的介绍。 进程、线程状态 进程一般分五个状态:创建,就绪,运行,阻塞,结束 线程一般...
  • 等待:当一个线程等待另一个线程通知调度器一个条件时,该线程进入等待状态。例如调用:Object.wait()、Thread.join()以及等待Lock或Condition。 可以通过代码与JConsole来验证 验证阻塞 public stati...
  • 1. sleep()方法:sleep()允许指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。这可以理解为休眠吗?或者是阻塞? 2.yield...
  • 挂起:一般是主动的,由系统或程序发出,甚至于辅存中去。(不释放CPU,可能释放内存,放在外存) ...操作系统中睡眠、阻塞、挂起的区别形象解释:  首先这些术语都是对于线程来说的。对线程
  • 线程等待和线程守护 线程等待: 使用的是join方法,其功能是指等待某个线程执行完成后主线程才会继续执行 线程守护: 使用的是setDaemon方法,其功能是指当主线程执行结束,不管调用该方法的进程有没有结束,...
  • Object中的wait()、notify()让线程等待和唤醒 Object.wait()、Object.notify()方法必须再synchronized修饰的代码块中才能正常使用,否则会报异常(语法不会显示有错误) 如下如果注释synchronized (obj)会报java.lang....
  • sleep()方法sleep()方法是定义在Thread上的native方法, 在设定时间段内(精度取决于CPU)阻塞线程的执行, 但是并不更改线程的锁持有情况.wait/notify机制wait()方法是定义在Object上的方法, 是java语言级的方法, 需要...
  • 一、触发线程阻塞线程等待线程竞争 程序:sv P193 例7.20 先放结论: 1、触发线程早于阻塞线程等待线程,则后两者不会触发。 2、同一仿真时间下,触发线程执行顺序在前,阻塞线程不会触发,等待线程触发。...
  • 线程死锁和堵塞

    2020-06-01 19:44:39
    在看并发编程的第一章的时候举出了一个死锁了的例子,感觉特别棒,于是就联想到了阻塞,我们知道在JAVA环境中,线程Thread有如下五个状态:(当然有人要说是七个状态,这个以后有机会再说) 1,新建状态 2,就绪...
  • python中的阻塞线程和阻塞线程

    千次阅读 2019-06-08 23:08:37
    python中的阻塞线程和阻塞线程 join( ) 阻塞主线程 join() 作用为阻塞主线程,即在子线程未返回的时候,主线程等待其返回然后再继续执行 join不能与start在循环里连用 以下为错误代码,代码创建了5个线程,然后用一...
  • java线程等待和唤醒

    2018-12-26 22:34:53
    一.基础知识 java有一句话叫做一切皆对象,这个最基本的对象就是object;在object中,定义了几个... wait():让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”...
  • C#线程中的等待阻塞

    千次阅读 2013-06-12 15:34:53
    ManualResetEvent类允许不同线程通过互发信号和等待彼此的信号来达到线程同步的目的。 它有三个重要的方法:Reset、SetWaitOne。 首先要初始化一个ManualResetEvent类,可定义如下: private ManaulResetEvent
  • c# 线程等待(堵塞)

    千次阅读 2017-09-02 19:51:00
    这两个是有区别的概念; 我可以说多线程天生就要异步的特点;但你不能说多线程成就等同于我们的异步编程; 根不能说异步编程就是我们的多线程。这里不要搞混淆了; 再net中的进化如下: 多线程:Thread =>...
  • 线程等待与唤醒

    2018-03-23 17:05:19
    线程等待与唤醒 标签: 多线程 基本方法简介 所有的等待唤醒线程,都是针对某个具体对象实例的. API接口 说明 wait() 让当前线程进入等待(阻塞)状态,直到其他线程调用此对象的notify()或...
  • 阻塞等待线程启动一、 应用场景 1. 子线程创建后不主动退出,主线程不能使用pthread_join被动等待线程结束。 2. 主线程创建子线程之后,后续业务逻辑的处理依赖于子线程中的业务处理状态。二、代码实现代码块...
  • 下面介绍一下常见的线程状态及等待唤醒机制 1. 线程状态概述 我们不需要去研究这几种状态的实现原理,我们只需知道在做线程操作中存在这样的状态。那我们怎么去理解这几个状态呢,新建与被终止还是很容易理解的,...
  • 线程阻塞

    2021-02-17 10:24:38
    我们通常会采用某线程在使用时另一线程休眠的方式,我们通过wait()方法来将线程休眠,休眠后进入等待状态,当我们使用notify()方法唤醒后,队列被占用,此时由于被唤醒的线程排在后面,所以无法执行,导致线程阻塞。...
  • 有关线程中断和线程阻塞

    千次阅读 2014-05-24 15:49:30
    一个线程都要从运行到结束都要经过3个阶段: 1、正在运行 2、准备结束运行 3、结束运行 那么怎么结束这个线程呢?可以通过下面这三个方法结束一个线程。 1、使用stop()方法强制结束线程。 2、使用thread....
  • 线程阻塞和中断

    2020-04-04 20:58:00
    1 线程的阻塞 阻塞非阻塞是形容多个线程之间的相互影响的,一个线程占用了临界区资源,那么其他线程必须在临界区外等待,阻塞是操作系统层面挂起,上下文切换...等待阻塞:运行的线程执行wait()方法,JVM会把该线...
  • 本篇主要讲java线程的并发等待。 2.内容: java线程最基本的两个内容在这里提一下,那就是线程的创建以及生命周期。 ①java线程的创建:可以通过继承Thread类或实现Runnable接口。 ②线程的生命周期:线程的...
  • Python2:线程挂起和线程阻塞 本文参考博客什么是线程阻塞?为什么会出现线程阻塞?、线程和进程/阻塞和挂起。 (1)线程挂起: ①线程挂起简介: 线程挂起操作实际上就是线程进入非可执行状态下,在这个状态下...
  •   (2)某个子线程等待一个或多个子线程执行完后再执行(或者)等待多个子线程中任何一个任务完成再执行   (3)线程嵌套(父子关系):在复杂的多线程编程中,需要更清晰的表现出线程之间的关系时使用。   ...
  • linux下的C语言开发(线程等待)

    千次阅读 2016-07-06 21:48:20
    线程等待

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 400,808
精华内容 160,323
关键字:

线程等待和阻塞的区别