• Java多线程7-线程休眠


    1、sleep()介绍

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

    2、sleep()示例

    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]: %d
    ",this.getName(),this.getPriority(),i);
    
                    if(i%4 == 0)
                        Thread.sleep(100);
                }
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
    
    public class SleepTest
    {
        public static void main(String[] args)
        {
            ThreadA t1 = new ThreadA("t1");
            t1.start();
        }
    }

    运行结果:

    t1 [5]: 0
    t1 [5]: 1
    t1 [5]: 2
    t1 [5]: 3
    t1 [5]: 4
    t1 [5]: 5
    t1 [5]: 6
    t1 [5]: 7
    t1 [5]: 8
    t1 [5]: 9

    结果说明:

    一个简单的小程序,当i%4==0的时候,线程休眠100ms

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

    wait()的作用是让当前线程由“运行状态”进入“等待状态”的同时,也会释放同步锁。而sleep()的作用是让当前线程由“运行状态”进入“休眠状态”。但是sleep()不会释放同步锁

    示例:

    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()
            {
                synchronized (obj)
                {
                    try
                    {
                        for(int i = 0;i <10;i++)
                        {
                            System.out.printf("%s: %d
    ",this.getName(),i);
                            if(i%4 == 0)
                                Thread.sleep(100);
                        }
                    }
                    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

    结果说明:

    主线程中启动了两个线程t1和t2。t1和t2在run()会引用同一个同步锁,synchronized(obj)。在t1运行的过程中,虽然调用了sleep(),但是t2无法获取CPU执行权,因为t1没有释放锁

  • 相关阅读:
    如何隐藏DLL中,导出函数的名称?
    排序算法之0-1、0-1-2排序
    在Vista以上版本运行WTL程序,有时候会提示“这个程序可能安装补正确...”的错误
    编码格式(未完待续......)
    WinDbg分析DUMP文件
    自己捣鼓了一个12306抢票软件,欢迎大家使用,并讨论改进方法!
    Cocos2D-X扫盲之坐标系、锚点
    Spring核心组件剖析
    走进Java中的持有对象(容器类)【二】Collection
    走进JVM【二】理解JVM内存区域
  • 原文地址:https://www.cnblogs.com/qumasha/p/12824931.html
Copyright © 2020-2023  润新知