zoukankan      html  css  js  c++  java
  • Java多线程(七)——线程休眠

    一、sleep()介绍

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

    二、sleep()示例

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

    package com.demo.sleep;
    
    public class ThreadA extends Thread{
        
         public ThreadA(String name){ 
             super(name); 
         }
         
         public synchronized void run() { 
            try {
                for(int i=0; i <10; i++){ 
                    System.out.printf("%s: %d
    ", this.getName(), i); 
                    // i能被4整除时,休眠100毫秒
                    if (i%4 == 0)
                        Thread.sleep(100);
                } 
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } 
    }
    package com.demo.sleep;
    
    public class SleepTest {
        
        public static void main(String[] args){
            ThreadA t1 = new ThreadA("t1");
            t1.start();
        }
    }

    运行结果:

    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毫秒。

    三、sleep()与wait()的比较

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

    下面通过示例演示sleep()是不会释放锁的。

    package com.demo.sleep;
    
    public class ThreadB extends Thread{
         
         private static Object obj = new Object();
         
         public ThreadB(String name){ 
             super(name); 
         }
         
         public void run(){
             synchronized(obj){
                 try {
                     for(int i=0; i <10; i++){ 
                         System.out.printf("%s: %d
    ", this.getName(), i); 
                         // i能被4整除时,休眠100毫秒
                         if (i%4 == 0)
                             Thread.sleep(100);
                     }
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         }
    }
    package com.demo.sleep;
    
    public class SleepLockTest {
        
         public static void main(String[] args){ 
             
             ThreadB t1 = new ThreadB("t1"); 
             ThreadB t2 = new ThreadB("t2"); 
             t1.start(); 
             t2.start();
         }
    }

    运行结果:

    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) 之后的源码:

    package com.demo.sleep;
    
    public class ThreadB extends Thread{
         
         private static Object obj = new Object();
         
         public ThreadB(String name){ 
             super(name); 
         }
         
         public void run(){
             //synchronized(obj){
                 try {
                     for(int i=0; i <10; i++){ 
                         System.out.printf("%s: %d
    ", this.getName(), i); 
                         // i能被4整除时,休眠100毫秒
                         if (i%4 == 0)
                             Thread.sleep(100);
                     }
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             //}
         }
    }

    再次运行SleepLockTest.java,结果如下:

    t1: 0
    t2: 0
    t2: 1
    t2: 2
    t1: 1
    t1: 2
    t2: 3
    t1: 3
    t2: 4
    t1: 4
    t1: 5
    t1: 6
    t1: 7
    t1: 8
    t2: 5
    t2: 6
    t2: 7
    t2: 8
    t1: 9
    t2: 9
  • 相关阅读:
    新浪微盘又是一个给力的产品啊,
    InfoQ: 百度数据库架构演变与设计
    列式数据库——Sybase IQ
    MapR初体验 淘宝共享数据平台 tbdata.org
    IBM正式发布新一代zEnterprise大型机(组图) 大型机,IBM,BladeCenter,美国,纽约 TechWeb News
    1TB is equal to the number of how many GB? 1PB equal to is equal to the number of TB? 1EB PB? | PCfault.com
    Cassandra vs HBase | WhyNosql
    The Hadoop Community Effect
    雅虎剥离开源软件平台 Hadoop ,与风投新建 Hortonworks 公司 品味雅虎
    RowOriented Database 、ColumnOriented Database 、KeyValue Store Database 、DocumentOriented Database
  • 原文地址:https://www.cnblogs.com/xiaoxi/p/6896912.html
Copyright © 2011-2022 走看看