我是靠谱客的博主 失眠朋友,最近开发中收集的这篇文章主要介绍多线程二:线程生命周期及sleep()方法和终止睡眠的三种方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

线程的生命周期:

  1. 新建状态:刚new出来的状态,此时还不能抢夺时间片。
  2. 就绪状态:调用start方法进入就绪状态。又 叫做可运行状态。 具有抢夺CPU时间片的权利 。
  3. 运行状态:当一个线程抢到CPU时间片后,进入运行状态。开始执行run方法。
  4. 死亡状态:run方法的结束标志着进入死亡。
  5. 阻塞状态:当一个线程遇到阻塞事件,此时线程会进入阻塞状态,阻塞状态的线程会放弃之前占有的时间片,当阻塞状态结束后又去抢夺时间片继续执行。

大家可以参考如下图片:
在这里插入图片描述
线程的几个方法

  1. 获取当前线程名字
   Thread thread = Thread.currentThread();
        System.out.println(thread.getName());//main
        Thread myThread = new MyThread();
        System.out.println(myThread.getName());//Thread-0
        Thread myThread2 = new MyThread();
        System.out.println(myThread2.getName());//Thread-1

currentThread()这个方法是静态方法,因为这个方法在main方法中进行所以得到的是主线程的名字。

  1. 静态方法 Thread.sleep(long millis) 作用是让当前线程进入休眠,进入阻塞状态,放弃占有CPU时间片,让给其它线程。
        Thread.sleep(5 * 1000);
        System.out.println("helloworld");

五秒后输出helloworld

面试题
在这里插入图片描述sleep()是一个静态的方法,用对象去调用这个方法,相当于是用类名调用
即 t.sleep(10005)等价于Thread.sleap(10005)
可能有的人用堆栈的方法去分析结果是一样的,但这样的分析是不对的。

3、sleep睡眠太久,如果希望它马上醒来用什么方法呢?interrupt() 方法

public class MyThread extends Thread{


    @Override
    public void run() {
        Thread thread  = Thread.currentThread();
        try {
            thread.sleep(1000*3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end the sleep");
    }
}
 Thread myThread = new MyThread();
        Thread threadMain = Thread.currentThread();
        myThread.start();
        threadMain.sleep(3000);
        myThread.interrupt(); 

在控制台上会出现如下的信息

java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.bjpowernode.ThreadTest.MyThread.run(MyThread.java:14)
end the sleep

run方法中信息还是输出来了,这种中断睡眠的方式靠的是异常的处理机制,interrupt() 这个方法只是打断了sleep(), 而没有中断run()方法的执行。这一点必须要清楚。

  1. 如何强行终止睡眠? stop()方法
Thread myThread = new MyThread();
        Thread threadMain = Thread.currentThread();
        myThread.start();
        threadMain.sleep(3000);
        myThread.stop();
@Override
    public void run() {
        Thread thread  = Thread.currentThread();
        try {
            for (int i=0;i<=10;i++){
                thread.sleep(1000);
                System.out.println(i);
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end the sleep");
    }

输出结果:0 1
stop()这个方法已经过期了,一般不用这个方法,因为这个方法会杀死线程,导致数据的丢失。

  1. 如何合理终止一个线程,用打标记的方式
public class MyRunnable implements Runnable {
    boolean flag = true;

    @Override
    public void run() {
//        if (flag) {
//            for (int i = 0; i < 100; i++) {
//                try {
//                    Thread.sleep(1000);
//                    System.out.println(i);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
//        }else {
//            return;

//        }
        for (int i=0;i<10;i++){
            if (flag){
                try {
                    Thread.sleep(1000);
                    System.out.println(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else {
                return;
            }
        }
   }
}
public class Test {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread myrt = new Thread(myRunnable);
        myrt.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        myRunnable.flag = false;
    }
}

大家如果感兴趣的话可以测测我注释的代码,会发现控制不了(我也不知道为什么,如果知道的可以评论留言,谢谢)

最后

以上就是失眠朋友为你收集整理的多线程二:线程生命周期及sleep()方法和终止睡眠的三种方法的全部内容,希望文章能够帮你解决多线程二:线程生命周期及sleep()方法和终止睡眠的三种方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部