概要

本章,会对Thread中sleep()方法进行介绍。涉及到的内容包括:
1. sleep()介绍
2. sleep()示例
3. sleep() 与 wait()的比较

转载请注明出处:http://www.cnblogs.com/skywang12345/p/3479256.html

1. sleep()介绍

sleep() 定义在Thread.java中。
sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。

2. sleep()示例

下面通过一个简单示例演示sleep()的用法。

  1. // SleepTest.java的源码
  2. class ThreadA extends Thread{
  3. public ThreadA(String name){
  4. super(name);
  5. }
  6. public synchronized void run() {
  7. try {
  8. for(int i=0; i <10; i++){
  9. System.out.printf("%s: %d\n", this.getName(), i);
  10. // i能被4整除时,休眠100毫秒
  11. if (i%4 == 0)
  12. Thread.sleep(100);
  13. }
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. }
  19.  
  20. public class SleepTest{
  21. public static void main(String[] args){
  22. ThreadA t1 = new ThreadA("t1");
  23. t1.start();
  24. }
  25. }

运行结果

  1. t1: 0
  2. t1: 1
  3. t1: 2
  4. t1: 3
  5. t1: 4
  6. t1: 5
  7. t1: 6
  8. t1: 7
  9. t1: 8
  10. t1: 9

结果说明
程序比较简单,在主线程main中启动线程t1。t1启动之后,当t1中的计算i能被4整除时,t1会通过Thread.sleep(100)休眠100毫秒。

3. sleep() 与 wait()的比较

我们知道,wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而sleep()的作用是也是让当前线程由“运行状态”进入到“休眠(阻塞)状态”。
但是,wait()会释放对象的同步锁,而sleep()则不会释放锁。
下面通过示例演示sleep()是不会释放锁的。

  1. // SleepLockTest.java的源码
  2. public class SleepLockTest{
  3.  
  4. private static Object obj = new Object();
  5.  
  6. public static void main(String[] args){
  7. ThreadA t1 = new ThreadA("t1");
  8. ThreadA t2 = new ThreadA("t2");
  9. t1.start();
  10. t2.start();
  11. }
  12.  
  13. static class ThreadA extends Thread{
  14. public ThreadA(String name){
  15. super(name);
  16. }
  17. public void run(){
  18. // 获取obj对象的同步锁
  19. synchronized (obj) {
  20. try {
  21. for(int i=0; i <10; i++){
  22. System.out.printf("%s: %d\n", this.getName(), i);
  23. // i能被4整除时,休眠100毫秒
  24. if (i%4 == 0)
  25. Thread.sleep(100);
  26. }
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32. }
  33. }

运行结果

  1. t1: 0
  2. t1: 1
  3. t1: 2
  4. t1: 3
  5. t1: 4
  6. t1: 5
  7. t1: 6
  8. t1: 7
  9. t1: 8
  10. t1: 9
  11. t2: 0
  12. t2: 1
  13. t2: 2
  14. t2: 3
  15. t2: 4
  16. t2: 5
  17. t2: 6
  18. t2: 7
  19. t2: 8
  20. t2: 9

结果说明
主线程main中启动了两个线程t1和t2。t1和t2在run()会引用同一个对象的同步锁,即synchronized(obj)。在t1运行过程中,虽然它会调用Thread.sleep(100);但是,t2是不会获取cpu执行权的。因为,t1并没有释放“obj所持有的同步锁”!
注意,若我们注释掉synchronized (obj)后再次执行该程序,t1和t2是可以相互切换的。下面是注释调synchronized(obj) 之后的源码:

  1. // SleepLockTest.java的源码(注释掉synchronized(obj))
  2. public class SleepLockTest{
  3.  
  4. private static Object obj = new Object();
  5.  
  6. public static void main(String[] args){
  7. ThreadA t1 = new ThreadA("t1");
  8. ThreadA t2 = new ThreadA("t2");
  9. t1.start();
  10. t2.start();
  11. }
  12.  
  13. static class ThreadA extends Thread{
  14. public ThreadA(String name){
  15. super(name);
  16. }
  17. public void run(){
  18. // 获取obj对象的同步锁
  19. // synchronized (obj) {
  20. try {
  21. for(int i=0; i <10; i++){
  22. System.out.printf("%s: %d\n", this.getName(), i);
  23. // i能被4整除时,休眠100毫秒
  24. if (i%4 == 0)
  25. Thread.sleep(100);
  26. }
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. // }
  31. }
  32. }
  33. }

更多内容

1. Java多线程目录(共xx篇)

2. Java多线程系列--“基础篇”01之 基本概念

3. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式 

4. Java多线程系列--“基础篇”03之 Thread中start()和run()的区别

5. Java多线程系列--“基础篇”04之 synchronized关键字

6. Java多线程系列--“基础篇”05之 线程等待与唤醒

7. Java多线程系列--“基础篇”06之 线程让步

Java多线程系列--“基础篇”07之 线程休眠的更多相关文章

  1. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...

  2. Java多线程系列--“基础篇”06之 线程让步

    概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...

  3. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  4. Java多线程系列 基础篇07 synchronized底层优化

    转载 http://www.cnblogs.com/paddix/ 作者:liuxiaopeng http://www.infoq.com/cn/articles/java-se-16-synchro ...

  5. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...

  6. Java多线程系列--“基础篇”11之 生产消费者问题

    概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...

  7. Java多线程系列--“基础篇”08之 join()

    概要 本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例 转载请注明出处:http ...

  8. Java多线程系列--“基础篇”04之 synchronized关键字

    概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...

  9. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式

    概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...

随机推荐

  1. XStream学习笔记

    XStream 所需jar包: xstream-1.3.jar xpp3_min-1.1.4c.jar xmlpull-1.1.3.1.jar 目录: 1.注解去除,标签中带有包名的节点 2.注解修改 ...

  2. mysql获取所有分类的前n条记录的两种方法浅析

      项目中有个需求是获取出展会分类下的前n条展商. 刚开始的思路是用group by 获取出展会的分类,后面再根据分类获取该分类下的n个展商,但也需要第一次获取出展会的时候也获取所有的每个展会分类下的 ...

  3. mysql 基本操作语句

    mysql 基本操作笔记: 创建表demo:CREATE TABLE `role` ( `role_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMME ...

  4. Windows下为MySQL做定时备份

    第一种:新建批处理文件 backup.dat,里面输入以下代码:  代码如下 复制代码 net stop mysqlxcopy "C:/Program Files/MySQL/MySQL S ...

  5. springmvc和struts2的差别

    springmvc和struts2的区别相关内容   1.spring mvc的入口是servlet,而struts2是filter filter功能:用户可以改变一个request和修改一个resp ...

  6. go json null字段的转换

    最近试了试go中对json null字段进行转换,代码如下: struct 转 json: package main import ( "encoding/json" " ...

  7. 给 admin 新建的 hdfs 文件的权限

    su hdfs hdfs dfs -chown -R admin /   org.apache.hadoop.security.AccessControlException: Permission d ...

  8. 设计模式之美:Iterator(迭代器)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Iterator 模式结构样式代码. 实现方式(二):实现 IEnumerable 中序遍历二叉树. 实现方式(三):实现 Bi ...

  9. 团队项目——站立会议DAY14

    第十四次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:修改页面,查漏补缺.进行需求分析,监督每个组员,把大家的问题都一一梳理. 2.钟灵毓秀:继续修改模块代码 ...

  10. Host is not allowed to connect to this MySQL server 错误的处理方法

    1. mysql>use mysql; mysql>update user set host = '%' where user = 'root'; mysql>select host ...