JAVA多线程07-基础篇-线程休眠sleep()

本节摘要:sleep()功能介绍,sleep()用法示例

一、功能介绍

让当前线程(调用sleep()方法的线程)休息一会,即是让当前线程由运行状态进入到阻塞状态,进而使其他线程有机会继续执行任务。虽然使线程休眠,但是并不释放对象锁,所以说如果在同步块中使用sleep(),其他线程仍然无法获得执行权限。

注意:sleep()方法定义在Thread类中,会调用sleep(millis)这个本地方法,抛出InterruptedException异常,因此需要捕获该异常

二、代码示例

public class SleepDemo {

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

class MyRunnable1 implements Runnable {

    @Override
    public void run() {
        synchronized (this) {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println(Thread.currentThread().getName() + "--" + i);
                    /**
                     * t1,t2引用同一个对象锁,
                     * 线程在模2为0的时候会休眠10ms,但是没有释放对象锁,所以其他线程还需继续等待,并不会获得cpu的执行权
                     */
                    if (i % 2 == 0) {
                        Thread.sleep(10);
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

程序输出:
t1--0
t1--1
t1--2
t1--3
t1--4
t2--0
t2--1
t2--2
t2--3
t2--4

三、结果说明

主线程中启动两个线程,这两个线程共享同一个Runnable实例。run方法是加锁方法,输出小于5的数,并在模2=0时休眠10ms。线程并没有交替执行,获得锁的线程执行结束后,另一个线程才能获取对象锁,进而执行。

四、总结

  • sleep()是静态方法,可以直接调用
  • sleep()方法使线程由运行状态转化为休眠阻塞状态
  • sleep()并不会释放对象锁

转载请注明作者及出处,并附上链接http://www.jianshu.com/u/ada8c4ee308b

你可能感兴趣的:(JAVA多线程07-基础篇-线程休眠sleep())