多线程系列五:多线程为何要使用休眠?(案例+代码示例)

在学习Java的道路上,是否路过多线程时总让你很迷惘;很不巧,我也是,而使我们感到很迷惘主要原因都源于没有对概念的深深的理解和实践。所以我决定漫步Java多线程,同你一起会会多线程。

多线程系列

多线程系列一:理解多线程在于深深地理解了多任务、进程、多线程、线程
多线程系列二:手撕多线程,从会三种创建多线程方式开始:除了常见的两种,你是否了解Callable接口方式?
多线程系列三:初遇并发问题:从一个小故事开始,从一行行代码开始**
多线程系列四:停止多线程,你不会还以为是用stop和destroy吧?
多线程系列五:多线程为何要使用休眠?
多线程系列六:线程礼让与强制执行
多线程系列七:纯手绘图解多线程状态+代码示例,就问你怕了吗?

多线程休眠我们其实并不陌生,看过多线程系列二的小伙伴可能有印象,里面的案例就用到我们的多线程休眠 sleep,然而是否有小伙伴思考过这个案例里为何要用休眠么?

没有的话没关系,我们一起看看。

有的非常好,我非常建议你要多思考,但是有更好的看法,也非常欢迎你可以评论。

至于为何要使用多线程休眠sleep很简单。

看使用它和不使用它会发生什么。

下面的代码示例,是多线程系列二的案例,使用了sleep

它发生了什么

可以看到下面运行结果:会出现重复买票,卖超的情况

public class sleepDemo implements Runnable{

    private Integer ticket = 2;

    @Override
    public void run() {
        while (true){
            if(ticket<=0){break;}
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"抢到了第"+ticket--+"张票");
        }
    }
    public static void main(String[] args) {
        sleepDemo thread = new sleepDemo();
        new Thread(thread,"小白").start();
        new Thread(thread,"小蓝").start();
        new Thread(thread,"一颗剽悍的种子").start();
    }
}

运行结果
在这里插入图片描述

没有使用sleep的情况下,可以看到恢复正常了,运行结果,没有出现重复卖票和卖超的情况。

难道没有sleep就可以了吗?

当然不是

上面的问题依然存在,只不过是因为我们CPU运行速度太快罢了

使用sleep加速和放大了问题的发生,起到模拟网络延时的效果。

public class sleepDemo implements Runnable{

    private Integer ticket = 2;

    @Override
    public void run() {
        while (true){
            if(ticket<=0){break;}
            System.out.println(Thread.currentThread().getName()+"抢到了第"+ticket--+"张票");
        }
    }
    public static void main(String[] args) {
        sleepDemo thread = new sleepDemo();
        new Thread(thread,"小白").start();
        new Thread(thread,"小蓝").start();
        new Thread(thread,"一颗剽悍的种子").start();
    }
}

在这里插入图片描述
sleep 除了可以模拟网络延时,还可以倒计时

public class ThreadDemo{
    public static void main(String[] args) {
        Date Time = new Date(System.currentTimeMillis());
        while (true){
            try {
                Thread.sleep(1000);
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(Time));
                Time = new Date(System.currentTimeMillis());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果
在这里插入图片描述

public class ThreadDemo{
    public static void main(String[] args) throws InterruptedException {
        Integer num = 5;
        while (true){
            Thread.sleep(1000);
            System.out.println(num--);
            if(num<=0){
                break;
            }
        }
    }
}

在这里插入图片描述
还有两点需要知道的

sleep 时间达到后线程会进入就绪状态。还有第二点会在谈到多线程同步时谈到,在每个对象中都会有一个锁,而sleep不会释放锁。

最后:

为了更好的阅读体验,我把想说的话都放在了下面,嘿嘿。

我是一颗剽悍的种子 把我会的,认真的分享 是我写博客一直不变的信条。
如果你能看到这篇博文,说明咱们还是很有缘的;希望能带给你一些许帮助,创作的不易,
把我文章的知识带走,你的三连留下,点赞,评论,关注,是我最大的动力。

猜你喜欢

转载自blog.csdn.net/A_hxy/article/details/107918680