线程中的sleep方法

线程中的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
posted @ 2022-07-30 08:48  星余明  阅读(1219)  评论(0编辑  收藏  举报