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不会释放锁。

转载于:https://www.cnblogs.com/hongchengshise/p/10404355.html

Thread-方法以及wait、notify简介相关推荐

  1. Object类中的两个方法——wait和notify使用总结

    Object类中的wait .和 notify方法是用来处理线程的方法,既然定义在Object类中,两个方法的重要程度可见一斑: 两个方法的使用上都很复杂:通过阅读API获得更多对方法的理解: The ...

  2. 脑电数据分析方法与应用实例简介-EEG Processing and Feature 1

    这是<EEG Processing and Feature Extraction>的第一个视频资料整理.内容是"脑电数据分析方法与应用实例简介". 视频地址:https ...

  3. 看了这一篇,就不用看别的——Java中Object关于锁的的三个方法:wait,notify,notifyAll的作用

    Object关于锁有三个重要的方法: 1 wait 让当前持有对象的线程等待,锁释放(所以必要条件是当前线程必须持有这个对象的锁(sychronized 或者可重入锁 ReentrantLock ), ...

  4. 笔记-13-多线程 Thread方法 线程安全 生产者和消费者 死锁和阻塞

    1.实现多线程 1.1简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 1.2并发和并行[理解] 并 ...

  5. java方法中 thread,Java中的線程Thread方法之---join()

    上一篇我們說到了Thread中的stop方法,這一篇我們再來看一下方法join的使用,那么方法Join是干啥用的? 簡單回答,同步,如何同步? 怎么實現的? 下面將逐個回答. join方法從字面上的意 ...

  6. python安装方法_Python基础入门——简介和环境配置,超实用!

    作者 | kbsc13 来源 | 机器学习与计算机视觉(ID:AI_Developer) 上周结束了如何构造一个机器学习项目的系列文章,当然还有一篇简单的总结以及介绍一些入门的学习资料,不过还在整理, ...

  7. java thread resume_java 线程Thread方法之suspend()和resume() | 学步园

    官方解释如下:http://download.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecat ...

  8. JS字符串补全方法padStart()和padEnd()简介

    一.关于字符串补全 在JS中,字符串补全是常用操作,用的比较多的就是时间或者日期前面的补0. 例如,日期,我们多采用4-2-2的表示形式,例如: 2018-07-23 当我们使用时间戳进行月份获取的时 ...

  9. windows 常用thread方法

    2019独角兽企业重金招聘Python工程师标准>>> 1.HANDLE CreateThread( _In_opt_LPSECURITY_ATTRIBUTES lpThreadAt ...

最新文章

  1. 在Ubuntu 14.04 64bit上安装redis 3.0.3
  2. 用 Git 和 Github 提高效率的 10 个技巧!
  3. Worktile 进军软件开发与协作的初心与野心
  4. 合理利用延迟初始化优化 Spring Boot
  5. XenServer 6.5实战系列之四:XenServer 6.5 Installation
  6. Mysql5.7安装错误处理与主从同步及!
  7. OO实现ALV TABLE 一:最简单的ALV显示
  8. C++2 dimension vector
  9. MyBatis的高级映射之多对一
  10. 在 Swift 语言中更好的处理 JSON 数据:SwiftyJSON
  11. xml文件导入wps_WPS2016文档怎么保存为XML格式?
  12. 怎样把一个字典的数据添加到另一个字典中?
  13. eclipse安装activiti 工作流插件
  14. 如何清空c盘只剩系统_如何深度清理c盘空间(怎么清理c盘只留下系统)
  15. Tilera--100核cpu
  16. date设置时间提示:Local time zone must be set--see zic manual page 2018
  17. oa项目经验描述_(完整版)简历中的项目经验范文
  18. mysql 存储类型文本最大长度longtext
  19. docker学习 --Compose 容器编排,常用命令等.集成spring。mysql。redis
  20. 微分电路与积分电路分析

热门文章

  1. 八成Java开发者解答不了的问题
  2. 一些C语言学习的国外资源
  3. Hadoop pipes编程
  4. 深度学习(六)caffe入门学习
  5. Python爬虫入门(2):爬虫基础了解
  6. Markdown 语法说明 (简体中文版)
  7. 2015年山石网科面试题
  8. 1、集合--相关概述
  9. C语言中 if 和 else if 的区别
  10. CSharpGL(50)使用Assimp加载骨骼动画