您的位置:

Java线程睡眠

一、基础概念

Java的线程睡眠是指让当前线程挂起一段时间,在指定时间后再继续执行。线程睡眠可以被其它线程打断,也可以设置是否响应中断。Java的线程睡眠的主要用途是使当前线程等待一段时间,或者是让出CPU,减轻CPU的负担,让其他线程有机会获取CPU资源。

Java的线程睡眠是通过Thread类的sleep()方法来实现的。sleep方法有两个重载方法,它们分别是:

1. public static void sleep(long millis) throws InterruptedException
2. public static void sleep(long millis,int nanos) throws InterruptedException

这两个方法都可能抛出InterruptedException异常,其中第一个方法的参数是线程睡眠的毫秒数,第二个方法的参数是线程睡眠的毫秒数和纳秒数。

二、使用示例

以下示例代码展示了线程睡眠的基本用法:

class SleepDemo extends Thread {
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("线程睡眠中..." + i);
            try {
                Thread.sleep(1000); //线程睡眠1秒钟
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        SleepDemo thread = new SleepDemo();
        thread.start();
    }
}

以上代码创建了一个SleepDemo线程,它会在其run方法中睡眠1秒钟,然后再执行下一次循环。在Main类的main方法中创建了一个SleepDemo线程,并启动线程。程序运行时,控制台会输出以下内容:

线程睡眠中...0
线程睡眠中...1
线程睡眠中...2
线程睡眠中...3
线程睡眠中...4
线程睡眠中...5
线程睡眠中...6
线程睡眠中...7
线程睡眠中...8
线程睡眠中...9

中间每个输出之间都会睡眠1秒钟。

三、线程睡眠被中断

由于Java的线程睡眠可以被其它线程打断,因此可能出现“线程睡眠被中断”的情况。以下示例代码展示了这种情况:

class SleepDemo2 extends Thread {
    volatile boolean flag = true;

    public void run() {
        while (flag) {
            System.out.println("线程睡眠中...");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                System.out.println("线程睡眠被中断...");
            }
        }
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        SleepDemo2 thread = new SleepDemo2();
        thread.start();
        Thread.sleep(10000);
        thread.flag = false;
        thread.interrupt();
    }
}

以上代码创建了一个SleepDemo2线程,它会在while循环中睡眠5秒钟,每个循环输出一次“线程睡眠中...”字符串。在Main类的main方法中,先创建并启动线程SleepDemo2,然后让主线程睡眠10秒钟后设置SleepDemo2的标志位为false,同时调用SleepDemo2线程的interrupt方法中断该线程的睡眠状态。

程序运行时,控制台会输出以下内容:

线程睡眠中...
线程睡眠中...
线程睡眠中...
线程睡眠中...
线程睡眠被中断...

在SleepDemo2线程第二次循环开始之前,它的睡眠状态被主线程中断了,然后进入catch组中的代码,输出“线程睡眠被中断...”字符串。

四、线程睡眠不响应中断

在设置线程睡眠时,可以设置线程不响应中断。示例代码如下:

class SleepDemo3 extends Thread {
    volatile boolean flag = true;

    public void run() {
        while (flag) {
            System.out.println("线程睡眠中...");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                System.out.println("线程睡眠被中断...");
            }
        }
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        SleepDemo3 thread = new SleepDemo3();
        thread.start();
        Thread.sleep(10000);
        thread.flag = false;
        thread.interrupt();
    }
}

以上代码与前面的SleepDemo2代码相同,但是在SleepDemo3的run方法中,并没有对线程的中断状态进行判断,因此即使使用了thread.interrupt方法,该线程也会继续睡眠,并不会被中断。

程序运行时,控制台会输出以下内容:

线程睡眠中...
线程睡眠中...
线程睡眠中...
线程睡眠中...
线程睡眠中...
线程睡眠中...
线程睡眠中...

SleepDemo3线程没有响应主线程的中断请求,仍然在继续睡眠状态。

五、小结

本文详细介绍了Java线程睡眠的基础概念和使用方法,并通过示例代码演示了线程睡眠被中断和线程睡眠不响应中断的情况。在实际的Java程序开发中,线程睡眠通常用于控制流程的顺序性和节约CPU资源等方面,但是需要注意线程睡眠被中断的情况,以便保证程序的稳定性。