java多线程系列基础篇07-----线程休眠

1 sleep()介绍

sleep()定义在Thread.java中

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

2 sleep()示例

package com.tuhu.filt.javadatasleep;

public class SleepTest {
    public static void main(String[] args) {
        ThreadC t1 = new ThreadC("t1");
        t1.start();
    }
}

class ThreadC extends Thread{
    public ThreadC (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);
                if( i%4 ==0){
                    Thread.sleep(100);
                }
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

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

3 sleep()与 wait()

wait  让当前线程由运行状态进入到等待阻塞状态 会释放同步锁

sleep 让当前线程由运行状态进入休眠阻塞状态 不会释放同步锁

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

package com.tuhu.filt.javadatasleep;
// 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);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

这和上一篇一个东西差不多,主线程main中启动了两个线程t1 和 t2 ,他们会引用同一个对象的同步锁,即synchronized(obj),在t1运行过程中,虽然他会调用Thread.sleep(100);但是t2是不会获取cpu执行权的。因为t1没有释放同步锁 注释掉synchronized(obj)后再次执行该程序t1和t2是可以相互切换的。比如用this

package com.tuhu.filt.javadatasleep;
// 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 (this) {
                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();
                }
            }
        }
    }
}

发布了84 篇原创文章 · 获赞 11 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章