您当前的位置: 首页 >  Java

java持续实践

暂无认证

  • 1浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java多线程 sleep方法详解&与wait方法的区别(面试常考)

java持续实践 发布时间:2020-08-30 10:42:49 ,浏览量:1

文章目录
      • sleep方法详解
      • sleep的时候不释放synchronized的monitor的demo
      • sleep的时候不释放Lock的demo

sleep方法详解

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的demo

如下的代码演示了 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被唤醒, 结束了方法的时候, 才会去释放锁.

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0410s