ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线程中的sleep方法

2022-07-30 09:02:39  阅读:131  来源: 互联网

标签:Thread 休眠 线程 ------ sleep main 方法


线程中的sleep方法

目录

一、关于线程的sleep方法

static void sleep(long millis)
1.静态方法:Thread.sleep(1000)
2.单位是毫秒
3.作用:让当前线程进入休眠,进入“阻塞状态”,放弃占用cpu时间片,让给其他线程使用
出现在那个线程,哪个线程就休眠
4.Thread.sleep()可以实现,隔一段时间去执行一段特定的代码。每隔多久就执行一次

废话不多说,直接上代码:

首先先写个代码来简单看一下,线程的休眠

例如,我们想要实现一个简单的输出操作,但是让它在10秒之后再执行

public class ThreaTest06 {
    public static void main(String[] args) {
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"---->简单的打印");

    }

}

输出:至于休眠效果可以自己试验一下,在这就不演示了!

main---->简单的打印

写个例子,让他可以一秒打印一个数字

public class ThreaTest06 {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"------>"+i);
            //当程序在循环中每执行一次输出,让它休眠一秒
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

}

输出:可以自己看一下是不是一秒打印一个数字

main------>0
main------>1
main------>2
main------>3
main------>4
main------>5
main------>6
main------>7
main------>8
main------>9

二、sleep让当前线程进入休眠

sleep并不是哪个线程调用就休眠哪个线程,要看sleep所在的位置

public class ThreadTest07 {
    public static void main(String[] args) {
        Thread t=new Thread07();
        t.setName("t");
        t.start();
        //调用sleeo方法
        try {
            //t线程在此不会进入睡眠,因为sleep是一个静态的方法,
            //刚才提到,sleep出现在哪里,就作用在哪里,现在是在主线程当中,主线程就休眠
            t.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("5秒之后执行");

    }
    static class Thread07 extends Thread{
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName()+"------>"+i);
            }
        }
    }
}

输出:在控制台中可以看到,t线程执行完之后,主线程休眠5秒,然会接着再执行输出操作!

t------>0
t------>1
t------>2
t------>3
t------>4
5秒之后执行

三、终止线程的休眠interrupt()

思考:如果一下线程休眠时间太长了,那么在中途怎么去唤醒这个线程

public class ThreadTest08 {
    public static void main(String[] args) {
        Thread t=new Thread(new Thread08());
        t.setName("t");
        t.start();
        //我们希望在5秒之后,醒来中断线程的睡眠,interrupt()方法
        try {
            t.sleep(1000*5);
        } catch (InterruptedException e) {
            //打印异常信息
            e.printStackTrace();
        }
        t.interrupt();//干扰
    }
}
    class Thread08 implements Runnable{
        // run()方法当中的一场不能throws,只能try
        //子类重写父类的方法时,子类不能比父类抛出更多的异常
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+"---->  begin");
            try {
                //睡一年
                Thread.sleep(1000*60*60*24*365);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"---->  end");
        }
    }

输出:

t---->  begin
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.thread.Thread08.run(ThreadTest08.java:32)
	at java.lang.Thread.run(Thread.java:748)
t---->  end

当然我们在输出时也可不打印异常信息

把e.printStackTrace();注释一下,因为抛出异常是t线程中的,所以是注释下面的这个打印信息

image-20220729105137711

看下输出结果:在睡眠之后打印end

t---->  begin
t---->  end

标签:Thread,休眠,线程,------,sleep,main,方法
来源: https://www.cnblogs.com/lingstar/p/16534292.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有