Thread.sleep
方法会导致当前线程暂停执行一段指定的时间。并会释放处理器给其它应用程序或线程。但是不会释放任何监视器(锁)的所有权。
模拟单核:
测试:
publicstaticvoidmain(String[] args) { // 锁对象Objectmonitor=newObject(); // Thread1newThread(() -> { System.out.println(Thread.currentThread().getName() +"开始执行"); // 同步块synchronized (monitor) { for (inti=0; i<5; i++) { if (i==3) { System.out.println(Thread.currentThread().getName() +"已暂停"); try { // 线程睡眠Thread.sleep(1); } catch (InterruptedExceptione) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() +":"+i); } System.out.println(Thread.currentThread().getName() +"执行完毕"); } }, "Thread1").start(); // Thread2newThread(() -> { System.out.println(Thread.currentThread().getName() +"开始执行"); // 同步块synchronized (monitor) { for (inti=0; i<5; i++) { System.out.println(Thread.currentThread().getName() +":"+i); } System.out.println(Thread.currentThread().getName() +"执行完毕"); } }, "Thread2").start(); // 防止所有线程执行完毕,睡眠中的线程没有被唤醒,造成Java进程被关闭// Thread.activeCount():当前活动线程// 默认线程:main线程、CG线程while (Thread.activeCount() >2) { } }
Thread1开始执行Thread1:0Thread1:1Thread1:2Thread1已暂停//线程睡眠Thread2开始执行//Thread1让出cpu,Thread2获取cpu时间,但是并未执行同步块中的代码Thread1:3Thread1:4Thread1执行完毕Thread2:0Thread2:1Thread2:2Thread2:3Thread2:4Thread2执行完毕