友情推荐:

  1. 线程池原理
  2. 多线程中断机制
  3. head first Thread.join()

实战分析

一直都说,Threed.sleep是不会释放锁,而wait是释放锁的(对象锁),现理论上来分析一下啊。

由于CPU分配的每个线程的时间片极为短暂(一般为几十毫秒),所以,CPU通过不停地切换线程执行,这样就给程序员一种错觉,以为多个线程是在同时执行。sleep就是正在执行的线程主动让出CPU,CPU去执行其他线程,在sleep指定的时间过后,CPU才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了CPU,但其他被同步锁挡住了的线程也无法得到执行。

package thread.concurrent;public class DeepenSleep implements Runnable {private int number = 10;public void firstMethod() throws Exception {synchronized (this) {System. out.println("in first method");number += 100;System. out.println("+100=" + number);}}public void secondMethod() throws Exception {synchronized (this) {System. out.println("in second method, prepare sleep");/*** (休息2S,阻塞线程) 以验证当前线程对象的机锁被占用时, 是否被可以访问其他同步代码块*/Thread. sleep(2000);System. out.println("wake up!!");// this.wait(2000);number *= 200;System. out.println("*200=" + number);}}@Overridepublic void run() {try {System. out.println("run thread...");firstMethod();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {DeepenSleep dt = new DeepenSleep();Thread thread = new Thread(dt);thread.start();System. out.println("prepare run second method");dt.secondMethod();}
}

输出如下:

分析:主线程启动起来,因为创建线程等的资源消耗,所以主线程会先执行 dt.secondMethod(),因此会先输出prepare run second method,其后执行secondMehtod方法(注意该方法是要先闹到锁对象),而该方法直接将线程睡眠2s(注意此处对象锁DeepenSleep的实例对象并没有释放),然后执行线程dt的run方法,该方刚发执行dt的firstMethod,然而,该方法也是需要获取锁对象的,而此时他没先不能获取到,因为secondMehtod没有释放锁(准确点讲,主线程没有释放锁);然后等了2s,主线程睡眠时间已过,他warkup之后,因为还拥有锁,因此直接run secondMethod的剩下的方法,先输出”wake up”,然后执行 number*200,执行完,主线程释放掉锁,而dt线程拿到锁,执行run方法,拿到锁,执行run方法的synchronized的剩余方法:先输出”in first method”,然后执行加100的操作。

我们来变一下将firstMethod的同步去掉,看输出是什么样子

package thread.concurrent;public class DeepenSleep implements Runnable {private int number = 10;public void firstMethod() throws Exception {
//         synchronized (this) {System. out.println( "in first method");number += 100;System. out.println( "+100=" + number);
//         }}public void secondMethod() throws Exception {synchronized ( this) {System. out.println( "in second method, prepare sleep");/*** (休息2S,阻塞线程) 以验证当前线程对象的机锁被占用时, 是否被可以访问其他同步代码块*/Thread. sleep(2000);System. out.println( "wake up!!");// this.wait(2000);number *= 200;System. out.println( "*200=" + number);}}@Overridepublic void run() {try {System. out.println( "run thread...");firstMethod();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {DeepenSleep dt = new DeepenSleep();Thread thread = new Thread(dt);thread.start();System. out.println( "prepare run second method");dt.secondMethod();}
}

输出如下:

分析:不同点在于,主线程睡眠之后,没有释放锁,dt线程执行firstMethod并不需要锁,因此先run firstMethod中的逻辑,先加100,然今,主线程睡醒之后,再执行剩下的逻辑,乘以200。

Thread.sleep(1000),1000ms后是否立即执行?

不一定,在未来的1000毫秒内,线程不想再参与到CPU竞争。那么1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束;况且,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。

Thread.sleep(0),是否有用?

boss:“给你睡0小时”。coder:“你TM逗我啊”。

休眠0ms,这样的休眠有何意义?Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争,重新计算优先级”。竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。这也是我们在大循环里面经常会写一句Thread.sleep(0) ,因为这样就给了其他线程比如Paint线程获得CPU控制权的权力,这样界面就不会假死在那里。

微信扫我^_^

深入Thread.sleep相关推荐

  1. Python 多线程总结(1)- thread 模块

    thread 模块 1. 单线程 首先看下单线程程序运行的例子,如下所示, import timedef loop0():print 'start loop0 begin', time.ctime() ...

  2. Exception in thread main java.lang.Error: 无法解析的编译问题: 方法 main 不能声明为 static;只能在静态类型或顶级类型中才能声明静态方法

    Exception in thread "main" java.lang.Error: 无法解析的编译问题: 方法 main 不能声明为 static:只能在静态类型或顶级类型中才 ...

  3. Android/Java 中线程(Thread)的使用

    看到 Thread 我们想到的是线程, 在说线程的使用的先简单的说下线程与进程的区别,这个面试题遇到的概率比较大, 进程:是系统进行资源分配的独立单元,   自己的理解就是 进程是程序的一次执行过程 ...

  4. Thread start()方法和run()方法的区别

    Thread start() 方法 ,是一个线程开始的方法 Thread run() 方法 ,就是一个普通的方法,可以理解为main方法里面的一个普通的方法 下面写一个demo 理解下 Thread ...

  5. java.lang.Thread使用及总结

    1 public class mainThread{ 2 public static void main(String args[]){ 3 //第一种方式启动线程 4 otherThread ot= ...

  6. JVM中可生成的最大Thread数量

    最近想测试下Openfire下的最大并发数,需要开大量线程来模拟客户端.对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几个: ...

  7. python学习笔记——Thread常用方法

    http://blog.sina.com.cn/s/blog_4b5039210100ewie.html Thread对象中的一些方法: 以前说过多线程,用到threading模块中的Thread对象 ...

  8. java thread isalive,《Java多线程编程核心技术(第2版)》 —1.4 isAlive()方法

    1.4 isAlive()方法 isAlive()方法的功能是判断当前的线程是否存活. 新建项目t7,类文件MyThread.java代码如下: public class MyThread exten ...

  9. java thread 无法执行_哪位大神帮我讲一下这段代码,为什么线程不能继续执行

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.A ...

  10. Java多线程,Thread,Runnable,Callable Task,Future<Task>,CompletionService

    一.Java多线程的方法 1. 继承 Thread 2. 实现 Runnable 3. 实现 Callable 可以有返回值 package com.test;import java.util.Arr ...

最新文章

  1. Linux系统命令常用查询
  2. sql增删改查_快速搞定数据库增删改查|附思维导图
  3. SpringBoot yaml的配置及使用
  4. think php excel,在thinkphp6中使用Excel
  5. Oracle 20c 新特性:缺省的只读 Oracle HOME 支持
  6. 如何防止在listbox中添加很多数据出现不停的刷新
  7. Git如何配置多个SSH-Key呢?
  8. Ubuntu18.04安装福昕阅读器
  9. 基于ssm校园餐厅订餐管理系统获取(java毕业设计)
  10. 2021年中国研究生数学建模竞赛E题参考思路
  11. QIIME 2教程. 01简介和安装Introduction Install(2021.2)
  12. python求最值_python求极值点(波峰波谷)
  13. Windows Server 2008 R2 企业版操作说明手册
  14. 如何取消html5微信页面授权,微信授权登录网页管理在哪里看?如何取消授权
  15. C++实现截图截屏功能汇总
  16. 全站仪和手机连接软件_测量员APP全站仪设站的的应用说明
  17. 查询水果价格c语言程序框图,浙大版《C语言程序设计(第3版)》题目集 练习3-8 查询水果价格 (15 分)...
  18. DP转HDMI音视频数据转换器普瑞PS176方案设计
  19. Win7右键没有“管理员取得所有权”选项的解决方法
  20. 汇编移位指令SHR,SAR,SAL/SHL,ROR,ROL,RCR,RCL

热门文章

  1. emacs .emacs_使用Emacs修改您的Git存储库,并获得Griffon 0.9发行说明的先睹为快
  2. icloud使用技巧_如何使用Apple Watch或iCloud查找iPhone
  3. SQL server练习题
  4. Angularjs标签模板加载原理
  5. 《兔战队》第二卷桥c
  6. python微信自动回复代码_使用python实现微信自动回复功能
  7. jsh和jq(jquery)的区分区别2(共三篇,详见我csdn)
  8. RedisTemplate String类型常用方法
  9. C++三大特性之多态(详细)
  10. 华科 中大 计算机 就业,华中科技大学就业信息网