1. sleep()介绍

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

2. sleep()示例

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

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

转载:http://www.cnblogs.com/skywang12345/p/3479256.html

java 多线程系列基础篇(七)之线程休眠的更多相关文章

  1. Java多线程系列--“基础篇”07之 线程休眠

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

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

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

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

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

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

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

  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包中的线程池来实现多线程.关于线程 ...

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

    概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答.本章内容包括:start() 和 run()的区别说明start() 和 run()的区别示例start( ...

随机推荐

  1. 汇编笔记 RETF

    assume cs:code stack segment db 16 dup(0) stack ends code segment start: mov ax,stack;将定义字形数据送入AX mo ...

  2. pg_stat_activity存储postgresql当前连接个数

    postgres=# \d pg_stat_activity 视观表 "pg_catalog.pg_stat_activity" 栏位 | 型别 | 修饰词------------ ...

  3. character_set_connection、character_set_results、 character_set_client的作用

    如题.通常的使用中,character_set_client,character_set_connection这两个变量的值是一样的,也就是说查询不需要进行编码转换.这样看来变量character_s ...

  4. 机器学习(二)—支持向量机SVM

    1.SVM的原理是什么? SVM是一种二类分类模型.它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器.(间隔最大是它有别于感知机) 试图寻找一个超平面来对样本分割,把样本中的正例和反例 ...

  5. angularjs 简单指令

    <!DOCTYPE html> <html data-ng-app="app"> <head> <title>angular js& ...

  6. XXX.APP已损坏,打不开.你应该将它移到废纸篓

    XXX.APP已损坏,打不开.你应该将它移到废纸篓 MACOS 10.12 SIERRA 如遇:「xxx.app已损坏,打不开.你应该将它移到废纸篓」,并非你安装的软件已损坏,而是Mac系统的安全设置 ...

  7. 发布本地jar到Nexus仓库

    mvn deploy:deploy-file -Durl=http://192.168.0.4:8081/nexus/content/repositories/thirdparty -Dreposit ...

  8. 剑指offer--21.链表中倒数第k个结点

    定义两个指针,当一个指针指到第K个结点时,第二个指针开始向后移动 -------------- 时间限制:1秒 空间限制:32768K 热度指数:602826 本题知识点: 链表 题目描述 输入一个链 ...

  9. mysql-jdbc创建connection理解

    jdbc源码分析(http://blog.csdn.net/brilliancezhou/article/details/5499738) 创建JDBC连接代码 Class.forName(" ...

  10. volatile关键字及内存可见性

    先看一段代码: package com.java.juc; public class TestVolatile { public static void main(String[] args) { T ...