thinking in java (四十一) ----- 多线程07之线程休眠

sleep()介绍

sleep()定义在Thread类中,作用是让当前线程休息,即当前线程会从运行状态转为阻塞状态吗,sleep会规定时间,线程休眠的时间大于该时间,就会被重新唤醒,变成就绪状态,等待CPU的调度执行

示例

package test;
//SleepTest.java的源码
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\n", this.getName(), i); 
             // i能被4整除时,休眠100毫秒
             if (i%4 == 0)
                 Thread.sleep(2000);
         } 
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
 } 
} 

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)休眠2000毫秒。

wait和sleep

wait是将线程由运行状态转为等待(阻塞)状态,也会释放同步锁,而sleep作用是让当前线程由运行状态进入休眠(阻塞)状态,但是不会释放锁。

package test;
//SleepLockTest.java的源码
public class SleepLockTest{ 

 private static Object obj = new Object();

 public static void main(String[] args){ 
     ThreadA t1 = new ThreadA("t1"); 
     ThreadA t2 = new ThreadA("t2"); 
     t1.start(); 
     t2.start();
 } 

 static class ThreadA extends Thread{
     public ThreadA(String name){ 
         super(name); 
     } 
     public void run(){ 
         // 获取obj对象的同步锁
         synchronized (obj) {
             try {
                 for(int i=0; i <10; i++){ 
                     System.out.printf("%s: %d\n", this.getName(), i); 
                     // i能被4整除时,休眠100毫秒
                     if (i%4 == 0)
                         Thread.sleep(100);
//                    	 obj.wait(100l);
//                     	obj.notifyAll();
                 }
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
     } 
 } 
}

运行结果:

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

// SleepLockTest.java的源码(注释掉synchronized(obj))
public class SleepLockTest{ 

    private static Object obj = new Object();

    public static void main(String[] args){ 
        ThreadA t1 = new ThreadA("t1"); 
        ThreadA t2 = new ThreadA("t2"); 
        t1.start(); 
        t2.start();
    } 

    static class ThreadA extends Thread{
        public ThreadA(String name){ 
            super(name); 
        } 
        public void run(){ 
            // 获取obj对象的同步锁
//            synchronized (obj) {
                try {
                    for(int i=0; i <10; i++){ 
                        System.out.printf("%s: %d\n", this.getName(), i); 
                        // i能被4整除时,休眠100毫秒
                        if (i%4 == 0)
                            Thread.sleep(100);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
//            }
        } 
    } 
}

或者说我们使用wait(long time),也是可以相互切换

 

 

原文:http://www.cnblogs.com/skywang12345/p/3479256.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值