sleep,yield,join,notify,wait,notifyAll区别
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()后的代码执行,这样来达到线程间通讯目的。
sleep,yield,join,notify,wait,notifyAll区别的更多相关文章
- java之sleep(),join(),yield(),wait(),notify()、notifyAll()区别
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- java多线程之yield,join,wait,sleep的区别
Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...
- java 线程之间通信以及notify与notifyAll区别。
jvm多个线程间的通信是通过 线程的锁.条件语句.以及wait().notify()/notifyAll组成. 下面来实现一个启用多个线程来循环的输出两个不同的语句. package com.app. ...
- java中wait()和sleep()的区别;notify()和notifyall()区别
先说两个概念:锁池和等待池 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入 ...
- JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
java线程存在以下几种状态: 1: 创建状态(New):线程被new出来,还未调用start 2: 就绪状态(Runnable):又称为可执行状态,调用线程的start方法后,线程处于就绪状态,,线 ...
- java线程中的wait和notify以及notifyall
一.区别与联系 1.1.wait(),notify()和notifyAll()都是java.lang.Object的方法,而确实sleep方法是Thread类中的方法,这是为什么呢? 因为wait和 ...
- 并发编程——线程中sleep(),yield(),join(),wait(),notify(),notifyAll()区别
前言 今天简单的讲一讲线程中sleep(),join(),yield(),wait(),notify(),notifyAll()这些方法的使用以及区别. 不过在讲这些方法之前,需要简单的介绍一下锁池和 ...
- Java多线程Thread.yield(),thread.join(), Thread.sleep(200),Object.wait(),Object.notify(),Object.notifyAll()的区别
Thread.yield(),在某个线程里调用Thread.yield(),会使这个线程由正在运行的running状态转变为等待cpu时间片的runable状态.join()是Thread类的一个非s ...
- Object的wait/notify/notifyAll&&Thread的sleep/yield/join/holdsLock
一.wait/notify/notifyAll都是Object类的实例方法 1.wait方法:阻塞当前线程等待notify/notifyAll方法的唤醒,或等待超时后自动唤醒. wait等待其实是对象 ...
随机推荐
- jenkins自动部署到tomcat报错:ERROR: Publisher hudson.plugins.deploy.DeployPublisher aborted due to exception
参考地址: http://blog.csdn.net/weiguang1017/article/details/9011353 manager-script — Access to the tools ...
- Publisher和Subscriber节点
一.Publisher节点 /*"ros/ros.h"里面包含了ROS系统内最常用的一些头文件,包含此文件,便可以使用ROS的核心功能.*/#include "ros/r ...
- Android使用动态代理搭建网络模块框架
1.Java中的动态代理相信大多数朋友都接触过,在此就不再赘述,如果有不明白的朋友,可以到网上搜一下(一搜一大堆,呵呵..) 2.本节主要阐述一下如何使用动态代理框架实现Android应用的瘦身开发. ...
- linux echo设置颜色
echo要变换颜色的时候,要使用参数-e 格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo -e "\033[41;36 ...
- 二分法php
二分法.分别使用while循环的方法和递归调用的方法. <?php // 二分法的使用数组必须是有序的,或升序,或降序 $arr = array( 1, 3, 5, 7, 9, 13 ); // ...
- 添加mysqld、apache服务到windows服务
mysqld --install “d:\apache\bin\httpd.exe” -k install
- 一键安装Docker图形化管理界面-Shipyard
Shipyard是一款开源的图形化的Docker管理工具,记得以前安装很麻烦的,现在官方有了自动安装脚本,使用非常方便.复制.粘贴.使用,就这么简单.先不研究他是如何实现的,安装使用起来再说. $ c ...
- MySQL在x64系统上1067问题解决
最近一个项目需要用到MYSQL,因为以前也弄过,所以就没怎么多想,直接下一个完事了.于是乎果断上官方网站下了一个installer(5.26),修改了一下默认位置和配置,然后一路next,最后在配置完 ...
- 【分享】Java学习之路:不走弯路,就是捷径
1.如何学习程序设计? JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用.有编程高手认为,JAVA也好C也好没什么分别,拿来就用.为 ...
- SpringBoot日记——Docker的使用
跟进互联网的浪潮有时候也挺难的,还没学完就出现新技术了…… 今天来说说,如何使用docker吧~ docker的安装配置 Docker是一个容器,我们怎么理解这个概念.我们做windows系统的时候会 ...