zoukankan      html  css  js  c++  java
  • Java多线程系列--“基础篇”07之 线程休眠

    概要

    本章,会对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
    ", 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 } 
    复制代码

    运行结果

    复制代码
    t1: 0
    t1: 1
    t1: 2
    t1: 3
    t1: 4
    t1: 5
    t1: 6
    t1: 7
    t1: 8
    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
    ", 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 } 
    复制代码

    运行结果

    复制代码
    t1: 0
    t1: 1
    t1: 2
    t1: 3
    t1: 4
    t1: 5
    t1: 6
    t1: 7
    t1: 8
    t1: 9
    t2: 0
    t2: 1
    t2: 2
    t2: 3
    t2: 4
    t2: 5
    t2: 6
    t2: 7
    t2: 8
    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
    ", 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 } 
    复制代码
  • 相关阅读:
    JDBC 复习4 批量执行SQL
    JDBC 复习3 存取Oracle大数据 clob blob
    Oracle复习
    Linux命令(1)grep
    JDBC 复习2 存取mysql 大数据
    JDBC 复习1 DBUtil
    php 环境搭建问题
    Windows 批处理 bat 开启 WiFi 菜单选项 设置ID PWD
    Bat 批处理启动和停止Oracle 服务
    docker 学习1 WSL docker ,Windows docker
  • 原文地址:https://www.cnblogs.com/wzyxidian/p/5292731.html
Copyright © 2011-2022 走看看