Java多线程7-线程休眠

一、sleep()介绍java

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

二、sleep()示例this

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\n",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();
    }
}

运行结果:spa

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的时候,线程休眠100mscode

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

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

示例:同步

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\n",this.getName(),i);
                        if(i%4 == 0)
                            Thread.sleep(100);
                    }
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:it

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没有释放锁

相关文章
相关标签/搜索