线程休眠-java

线程休眠

  • sleep( 时间 ) 指定当前线程阻塞的毫秒数
  • sleep存在异常InterruptedException
  • sleep时间到达后,线程进入就绪状态
  • sleep可以模拟网络延时,倒计时等等
  • 每一个对象都有一个锁,sleep不会释放锁

线程休眠可以应用在许多地方,例如:模拟网络延迟、模拟倒计时等。

代码演示

模拟网络延迟

线程休眠可以放大问题的发生性。

例如下边的例子:

public class TestThread4 implements Runnable{
    private int ticketNums = 10;//票数
    @Override
    public void run() {
        while (true){
            if (ticketNums <= 0){
                break;
            }
            //Thread.currentThread().getName()方法获取线程名字
            System.out.println(Thread.currentThread().getName()+"----拿到了第"+ticketNums--+"张票~");
        }
    }

    public static void main(String[] args) {
        TestThread4 ticker = new TestThread4();

        new Thread(ticker,"小明").start();
        new Thread(ticker,"Pete").start();
        new Thread(ticker,"钢铁侠").start();
    }
}

不使用线程休眠那么运行结果如下。好像挺正常的。

小明----拿到了第10张票~
小明----拿到了第9张票~
小明----拿到了第8张票~
小明----拿到了第7张票~
小明----拿到了第6张票~
小明----拿到了第5张票~
小明----拿到了第4张票~
小明----拿到了第3张票~
小明----拿到了第2张票~
小明----拿到了第1张票~

Process finished with exit code 0

在TestThread4的run方法中添加线程休眠,模拟延时。添加代码如下:

Thread.sleep(200);//模拟延时
public class TestThread4 implements Runnable{
    private int ticketNums = 10;//票数
    @Override
    public void run() {
        while (true){
            if (ticketNums <= 0){
                break;
            }
            try {
                Thread.sleep(200);//模拟延时
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //Thread.currentThread().getName()方法获取线程名字
            System.out.println(Thread.currentThread().getName()+"----拿到了第"+ticketNums--+"张票~");
        }
    }

    public static void main(String[] args) {
        TestThread4 ticker = new TestThread4();

        new Thread(ticker,"小明").start();
        new Thread(ticker,"Pete").start();
        new Thread(ticker,"钢铁侠").start();
    }
}

运行结果:

Pete----拿到了第9张票~
小明----拿到了第8张票~
钢铁侠----拿到了第10张票~
Pete----拿到了第6张票~
钢铁侠----拿到了第5张票~
小明----拿到了第7张票~
Pete----拿到了第4张票~
钢铁侠----拿到了第2张票~
小明----拿到了第3张票~
Pete----拿到了第1张票~
钢铁侠----拿到了第1张票~
小明----拿到了第0张票~

Process finished with exit code 0

发现问题:多个线程操作一个资源时,会导致线程不安全,数据紊乱。

模拟倒计时

使用Thread.sleep(1000);让线程休眠一秒。

//线程休眠,模拟倒计时
public class TestSleep {
    public static void tenDown(){
        int num = 10;
        while(true){
            System.out.println(num--);//打印数字,之后减一
            try {
                Thread.sleep(1000);//线程休眠一秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(num <= 0){
                break;
            }
        }
    }

    public static void main(String[] args) {
        tenDown();
    }
}

运行结果:

10
9
8
7
6
5
4
3
2
1

Process finished with exit code 0

打印时间

使用Thread.sleep(1000);让线程休眠一秒。每秒钟打印一次系统时间。

public class TestSleep {
//    打印系统时间
    public static void printDate(){
        Date nowTime = new Date(System.currentTimeMillis());//获取系统当前时间
        while (true){
            System.out.println(new SimpleDateFormat("HH:mm:ss").format(nowTime));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            nowTime = new Date(System.currentTimeMillis());//更新时间
        }
    }

    public static void main(String[] args) {
        printDate();
    }
}

运行结果:

...
16:00:48
16:00:49
16:00:50
...

学习自B站遇见狂神说
相关博客:多线程-汇总

你可能感兴趣的:(多线程-Java,java,多线程,线程休眠)