Thread.sleep()
1.静态方法是定义在Thread类中。
2.Thread.sleep()方法用来暂停当前执行的线程,将CPU使用权释放给线程调度器,但不释放锁(也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据),进入sleeping状态

的线程不能被notify方法唤醒。在自动苏醒(超过指定的毫秒数)之后不保证能获取到CPU,它会先进入就绪态,与其他线程(不分高低优先级)竞争CPU。有两个sleep方法,一个只有一个毫

秒参数,另一个有毫秒和纳秒两个参数。如果其他的线程中断了一个休眠的线程,sleep方法会抛出Interrupted Exception。sleep是帮助其他线程获得运行机会的最好方法,但不会让出锁。

Thread.yield()
1.静态方法是定义在Thread类中。
2.yield方法会临时暂停当前正在执行的线程,来让有同样优先级的正在等待的线程有机会执行。如果没有正在等待的线程,或者所有正在等待的线程的优先级都比较低,那么该线程会继续运

行(只能使同优先级的线程有执行的机会)。执行了yield方法的线程什么时候会继续运行由线程调度器来决定,不同的厂商可能有不同的行为。yield方法不保证当前的线程会暂停或者停止

,但是可以保证当前线程在调用yield方法时会放弃CPU和锁。

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

wait
1.定义在Object类中的非静态方法。

2.用于线程间通信的,会释放cpu和锁。应在同步环境中调用。能够被notify和notifyAll唤醒。
3.void wait() 在其他线程调用此对象的 notify() 方法或者 notifyAll()方法前,导致当前线程等待。

void wait(long timeout)在其他线程调用此对象的notify() 方法 或者 notifyAll()

方法,或者超过指定的时间量前,导致当前线程等待。

wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其他shnchronized数据可被别的线程使用。

wait()h和notify()因为会对对象的“锁标志”进行操作,所以他们必需在Synchronized函数或者 synchronized block 中进行调用。如果在non-synchronized 函数或 non-synchronized

block 中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

关键字synchronized

该关键字用于保护共享数据,当然前提条件是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问到该对象,被Synchronized修饰的数据将被"上锁",阻止其他线程访问

。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。

有一个易错的地方,当调用t.sleep()的时候,会暂停线程t。这是不对的,因为Thread.sleep是一个静态方法,它会使当前线程而不是线程t进入休眠状态。例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完毕后,低优先级的线程才能够执行 ;但是高优先级的线程sleep(500)后,低优先级就有机会执行了。

线程优先级低并不意味着得不到处理器执行,而只是执行的频率低一点而已。而且线程的优先级一般不用我们程序员去主动设置,所以这两个方法对我们来说基本没啥用哈哈~。
在一个运行系统中,如果较高优先级的线程没有调用sleep方法,也没有受到I/O阻塞,那么较低优先级线程只能等待所有较高优先级的线程运行结束,方可有机会运行。
wait()和notify()、notifyAll() 这三个方法都是java.lang.Object的方法。
这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用。synchronized关键字用于保护共享数据,阻止其他线程对共享数据的存取,但是这样程序的流程就

很不灵活了,如何才能在当前线程还没退出synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。

wait()方法使当前线程暂停执行并释放对象锁标示

,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中

线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。

notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

以下是waitsleep的区别

    • wait是Object的成员方法,而sleep是Thread的静态方法。

    • 调用wait方法需要先获得锁,而调用sleep方法是不需要的。

    • 调用wait方法的线程需要用notify来唤醒,而sleep必须设置超时值。

    • 线程在调用wait方法之后会先释放锁,而sleep不会释放锁。

Thread-方法以及wait、notify简介的更多相关文章

  1. Java中Thread方法启动线程

    public class ThreadTest extends Thread {  private int count = 10; @Override public void run() { //重写 ...

  2. java Thread方法解析: sleep join wait notify notifyAll

    转载自: sleep(),yield(),wait()区别详解:http://dylanxu.iteye.com/blog/1322066 join方法详解:http://www.open-open. ...

  3. 复习线程——状态和几个Thread方法

    一.线程的状态 (参考文章:https://blog.csdn.net/a58220655/article/details/76695142) 状态介绍 新建(new):处于该状态的时间很短暂.已被分 ...

  4. 线程方法wait()和notify()的使用

    实现需求: 开启2个线程,1个线程对某个int类型成员变量加1,另外1个减1,但是要次序执行,即如果int型的成员变量是0,则输出01010101这样的结果 代码如下 1 package test; ...

  5. Thread 方法

    Thread类的一些被Thread对象调用的方法: 1 public void start() 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 2 public void run() ...

  6. Java并发编程:Java Thread方法join的简单总结

    虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间 ...

  7. 2016/1/25 多线程 作业 方法一 继承Thread 方法二 实现Runnable 多线程笔记

    /* * 1,尝试定义一个继承Thread类的类,并覆盖run()方法, * 在run()方法中每隔100毫秒打印一句话.*/ package Stream; //方法一 继承Thread 实现多线程 ...

  8. Java学习之Thread方法

    一.sleep()方法:在同步中,释放CPU执行权,不释放同步锁,意味着程序停止 二.停止线程方法:原理:run执行完成 1.设置标记 class StopThread implements Runn ...

  9. Java中的线程Thread方法之---interrupt()

    前几篇都介绍了Thread中的几个方法,相信大家都发现一个相似点,那就是sleep,join,wait这样的阻塞方法都必须捕获一个InterruptedException异常,顾名思义就是一个线程中断 ...

随机推荐

  1. 转载:轻量级Config文件AppSettings节点编辑帮助类

    using System.Configuration; using System.Windows.Forms; namespace Allyn.Common { public class XmlHep ...

  2. tp3.2 phpexcel 简单导出多个sheet(execl表格)

    参考链接:https://blog.csdn.net/u011341352/article/details/70211962 以下是公共类PHPExcel.php文件: // 开始 <?php/ ...

  3. Python3,x:Fiddler抓包工具如何进行手机APP的数据爬取

    示例一:苹果手机抓取教程 https://www.cnblogs.com/lizm166/p/8693085.html https://blog.csdn.net/cui130/article/det ...

  4. qsort例子

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> typ ...

  5. UVA 10534 Wavio Sequence

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=17&p ...

  6. SprirngBoot微服务之间的交互—— restTemplate

    一 例:需要在storage服务中请求utils服务的某个接口(两个服务都已向同一台eureka server 注册) 步骤: 1 在utils创建需被调用的接口 @RestController @R ...

  7. selenium中动作链的使用

    一.问题 我们有时候在使用selenium的时候,会遇到悬停后点击元素的操作,因此需要一个动作链来完成这个功能. 二.解决 从selenium的包中导入actionchains函数,利用xpath找到 ...

  8. VM无法连接到虚拟机

    The VMware Authorization Service is not running. 原因 虚拟机服务没有开启 解决方法 1.      我的电脑右击->管理 2.      打开服 ...

  9. C++ MFC棋牌类小游戏day6

    双人单机小游戏做完了,规则那部分还没介绍,暂时不打算介绍了,因为写的这个bug太多,我打算重新修改. 链接:https://pan.baidu.com/s/1XQKPSv0Tw36Qi2TeaRJiM ...

  10. xml to xsd ; xsd to xml

    xml to xsd 工具网站 https://www.freeformatter.com/xsd-generator.html 示例xml <?xml version="1.0&qu ...