1.  Thread.sleep(long) 和Thread.yield()都是Thread类的静态方法,在调用的时候都是Thread.sleep(long)/Thread.yield()的方式进行调用。而join()是由线程对象来调用。

2.  Thread.sleep(long)是让当前运行的线程睡眠一会,这里说的睡眠的意思是让线程从运行状态进入阻塞状态,只有等阻塞时间过后才进入就绪状态(并不是直接进入运行状态),是否进入运行状态就要看jvm的内部调用机制了,通常是级别较高的处于就绪状态的线程会被调度进入就绪状态。

3.  线程如果是通过继承Thread类,重写起run方法来实现的,那么在调用Thread.sleep(long)/Thread.yield()方法时当然可以不要Thread,直接使用sleep(long)/yield()。但如果是实现Runnable接口来实现的就必须有Thread。

4.  如果Thread.sleep(long)/Thread.yield()使用在由synchronized锁定的代码块或者方法当中,那么在调用他们的过程当中,并不会释放锁。而是即使是睡眠也抱着这把锁不让别人访问。

5.join()方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。注意该方法和sleep方法都要捕获异常。

6.yield()方法是让当前线程直接由运行状态进入就需状态,然后让jvm重新调度一次,但是这次调度只会让处于就绪队列中比当前线程优先级高或者相等的线程运行,很可能某个线程在调用了yield方法后,又被jvm调度进来运行。

7.wait()和notify()、notifyAll() 这三个方法用于协调多个线程对共享数据的存取所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized这个关键字用于保护共享数据,阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。 notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

8.我对wait的一点个人理解:

将设线程为A线程、A线程持有锁(进入synchronized代码段)后执需要行同步代码,当执行到调用锁.wait()时,意思是让A线程进入阻塞状态(注意这个时候A线程的synchronized方法中锁.notify()这句代码后可能还有一大段代码没有执行就被阻塞在这里了)并且释放同步锁(释放锁的同时将自身线程放入到了该锁的等待队列当中);释放锁的瞬间其他的线程就已经获取到了该锁(这里姑且给这个其他线程起个名字叫做B线程)、当B线程调用了锁.notify()的时候其实B线程自己是一点都没有受到影响,因为这时B既没有阻塞也没有释放锁还是没事一样的执行完synchronized里面的代码;但是B线程刚刚的那句锁.notify()可以告诉虚拟机我B线程可能马上就要执行完了(当然具体多久还是程序员说了算,这个完全要看B线程的synchronized方法中锁.notify()这句代码后面还有多长没执行完),还告诉虚拟机你现在要立即从锁的等待队列中取出一个线程进入到就绪状态(这时候可能恰巧将A线程取出来了)。但这是A线程并不能立即就执行,因为B可能还没有执行完(没执行完就没有释放锁),A线程要想继续执行就必须再次获得锁;一旦B执行完,A就能获得锁了。但是A获得了锁是不是从synchronized方法重头再执行一遍呢?肯定不是!这时候A会接着上次notify()后的代码执行,这样来达到线程间通讯目的。

[转]wait,notify,notifyAll,join,yield,sleep的区别和联系的更多相关文章

  1. 【转】wait,notify,notifyAll,join,yield,sleep的区别和联系

    1.  Thread.sleep(long) 和Thread.yield()都是Thread类的静态方法,在调用的时候都是Thread.sleep(long)/Thread.yield()的方式进行调 ...

  2. java多线程中wait/notify/sleep/join/yield方法以及多线程的六种状态

    刚开始学线程的时候也是被这几个方法搞的云里雾里的,尤其是一开始看的毕老师的视频,老师一直在强调执行权和执行资格,看的有点懵逼,当然不是说毕老师讲的不好,就是自己有点没听明白,后来复习看了一些其他的博客 ...

  3. Object的wait/notify/notifyAll&&Thread的sleep/yield/join/holdsLock

    一.wait/notify/notifyAll都是Object类的实例方法 1.wait方法:阻塞当前线程等待notify/notifyAll方法的唤醒,或等待超时后自动唤醒. wait等待其实是对象 ...

  4. java之sleep(),join(),yield(),wait(),notify()、notifyAll()区别

    1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...

  5. 并发编程——线程中sleep(),yield(),join(),wait(),notify(),notifyAll()区别

    前言 今天简单的讲一讲线程中sleep(),join(),yield(),wait(),notify(),notifyAll()这些方法的使用以及区别. 不过在讲这些方法之前,需要简单的介绍一下锁池和 ...

  6. 线程sleep,wait,notify,join,yield方法解析

    线程的五种状态 线程从创建到销毁一般分为五种状态,如下图: 1) 新建 当用new关键字创建一个线程时,就是新建状态. 2) 就绪 调用了 start 方法之后,线程就进入了就绪阶段.此时,线程不会立 ...

  7. java 多线程之wait(),notify,notifyAll(),yield()

    wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能.因为都个对像都 ...

  8. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  9. java多线程之yield,join,wait,sleep的区别

    Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...

随机推荐

  1. 网站博客更换主机空间搬家:Discuz! X2.5老鹰主机搬家全过程

    http://www.freehao123.com/discuz-x2-5-banjia/由于我放在hawkhost老鹰主机主机的部落论坛就要到期了,而老鹰主机的续费价格却是按照原价来的,没有任何优惠 ...

  2. Android开发之5大布局方式详解

    Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...

  3. Android HTTP通讯

    这里有一个非常棒的http通讯的总结,我看了以后茅塞顿开. 先贴代码: 01 public class Activity1 extends Activity { 02   03     private ...

  4. 原生js,插入元素

    function insert(){ var tarDiv = document.getElementById("aId"); var newDiv = document.crea ...

  5. AspxPivotGrid和WebChartControl数据联动处理日志

    AspxPivotGrid具有很好的表格样式体验,WebChartControl也是个很内容丰富的做图控件,我希望实现的功能是这样的, 处理题库统计分析图表,用户点AspxPivotGrid绑定知识点 ...

  6. Linux内存初始化(一)

    一.前言 一直以来,我都非常着迷于两种电影拍摄手法:一种是慢镜头,将每一个细节全方位的展现给观众.另外一种就是快镜头,多半是反应一个时代的变迁,从非常长的时间段中,截取几个典型的snapshot,合成 ...

  7. 轻松搞定面试中的“虚"

    提要 今天要整理的知识点是C++中有关虚的一切. 包括:虚函数,纯虚函数,虚基类,虚继承... 1.什么是虚函数,有什么作用? 在基类用virtual声明成员函数为虚函数.这样就可以在派生类中重新定义 ...

  8. Ruby gem 更换国内源

    gem sources --add http://gems.ruby-china.org/ --remove https://rubygems.org/

  9. Java总结篇系列:Java多线程(四)

    ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...

  10. Android --------------------ActionBar 与 ViewPager 和 ActionTab 切换 的源代码实现

    參考网址: 点击打开链接 源代码实现: package com.example.actionbardemo2; import android.app.ActionBar; import android ...