文章目录
sleep方法详解
- sleep方法详解
- sleep的时候不释放synchronized的monitor的demo
- sleep的时候不释放Lock的demo
sleep方法的作用: 只想让线程在预期的时间执行, 其他时候不要占用CPU资源. sleep方法 的特点: 不释放锁: 包括synchronized和lock 与wait的区别就在于 wait会释放锁.
sleep的时候不释放synchronized的monitor的demo如下的代码演示了, 线程sleep的时候, 不释放synchronized的monitor , 等sleep 时间到了之后, 正常结束了, 才会释放锁. run方法中, 调用了同步代码方法. 同步方法中, 线程休眠2s .
package com.thread.threadobjectclasscommonmethods;
/**
* 类名称:SleepDontReleaseMonitor
* 类描述:线程sleep的时候, 不释放synchronized的monitor ,
* 等sleep 时间到了之后, 正常结束了, 才会释放锁.
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/8/30 10:12
* Version 1.0
*/
public class SleepDontReleaseMonitor implements Runnable{
public static void main(String[] args){
SleepDontReleaseMonitor runnable = new SleepDontReleaseMonitor();
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.setName("thread1");
thread2.setName("thread2");
thread1.start();
thread2.start();
}
@Override
public void run() {
syn();
}
private synchronized void syn() {
System.out.println("线程 "+Thread.currentThread().getName() +"获取到了monitor");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程 "+Thread.currentThread().getName() +"退出了同步代码块");
}
}
程序执行的结果如下, 在thread1休眠的时候, 由于没有释放锁, 所以threa2是无法进入的. 直到休眠的时间结束了, 退出了同步代码的方法, 才会释放锁 . 之后thread2才会进入同步方法,进行打印. 此例子也说明了sleep方法与wait的一个重大的区别就在于 wait会释放锁. sleep方法不会释放锁
如下的代码演示了 sleep的时候, 不释放lock. 使用ReentrantLock, 进入run方法的时候, 先加锁, 然后 sleep. 注意要在try catch的finally中 释放锁lock.unlock();
package com.thread.threadobjectclasscommonmethods;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 类名称:SleepDontReleaseLock
* 类描述: 验证线程sleep的时候, 不释放lock
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/8/30 10:31
* Version 1.0
*/
public class SleepDontReleaseLock implements Runnable {
private static final Lock lock = new ReentrantLock();
@Override
public void run() {
//加锁
lock.lock();
System.out.println("线程 " + Thread.currentThread().getName() + "获取到了锁");
try {
Thread.sleep(5000);
System.out.println("线程 " + Thread.currentThread().getName() + " 已经被唤醒");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//解锁
lock.unlock();
}
}
public static void main(String[] args) {
SleepDontReleaseLock runnable = new SleepDontReleaseLock();
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.setName("thread1");
thread2.setName("thread2");
thread1.start();
thread2.start();
}
}
运行程序打印如下, 与synchronized相同的是 , thread1在sleep的时候, 是不会释放锁的, 因此等待五秒钟, thread1被唤醒, 结束了方法的时候, 才会去释放锁.