• 【JavaSE】多线程篇(二)线程终止、线程中断与线程插队


    💁 个人主页:黄小黄的博客主页
    ❤️ 支持我:👍 点赞 🌷 收藏 🤘关注
    🎏 格言:All miracles start from sometime somewhere, make it right now.
    本文来自专栏:JavaSE从入门到精通
    在这里插入图片描述


    1 线程终止

    🆔 简要说明:

    1. 当线程完成任务后,会自动退出;
    2. 还可以通过 使用变量来控制run方法退出的方式停止线程,即通知方式。

    🦁 案例演示:

    启动一个线程t,要求在main线程中去停止线程t,请通过编程实现。

    /**
     * @author 兴趣使然黄小黄
     * @version 1.0
     */
    public class ThreadExit01 {
        public static void main(String[] args) {
            T t = new T();
            t.start();
    
            //如果希望main线程去控制t线程的终止,则需要修改loop
            //让t退出run方法,从而终止t线程,即通知方式
            //先让主线程休眠5秒,再退出
            try {
                Thread.sleep(5 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t.setLoop(false);
        }
    }
    
    class T extends Thread{
    
        /**
         * 控制变量
         */
        private boolean loop = true;
    
        @Override
        public void run() {
            while (loop){
                System.out.println("T 运行中......");
    
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public void setLoop(boolean loop) {
            this.loop = loop;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    在这里插入图片描述


    2 线程常用方法

    2.1 常用方法一览表

    方法名说明
    setName设置线程名称,使之与参数 name 相同
    getName返回该线程的名称
    start使该线程开始执行,Java虚拟机底层调用该线程的start0方法
    run调用线程对象 run 方法
    setPriority更改线程的优先级
    getPriority获取线程的优先级
    sleep在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
    interrupt中断线程(与终止不同),没有真正的结束线程,一般用于中断正在休眠的线程
    yield线程的礼让。让出cpu,让其他的线程执行,但礼让时间不确定,所以不一定礼让成功
    join线程的插队。线程的插队一旦插入成功,则肯定先执行插入的线程所有的任务

    2.2 方法注意事项

    1. start 底层会创建新的线程,调用 run。而直接调用 run,就是一个简单的方法调用,不会启动新的线程;

    2. 线程优先级范围:最低优先级为1,正常为5,最高为10;
      在这里插入图片描述

    3. interrupt,中断线程,但是并没有真正的结束线程,一般用于中断正在休眠的线程;

    4. sleep,线程的静态方法,使当前线程休眠。


    3 线程中断

    线程的中断通过interrupt方法实现。 在该案例中,创建一个线程Cat,该线程run方法会不停的打印“喵喵喵~”。在主线程中,我们记录主线程打印“hello”的次数,当打印5次时,则中断cat线程的休眠。

    🐱 示例代码及结果:

    /**
     * @author 兴趣使然黄小黄
     * @version 1.0
     * 线程中断案例演示
     */
    public class ThreadTest {
        public static void main(String[] args) throws InterruptedException{
            Cat cat = new Cat();
            cat.start();
    
            // 主线程打印5次 hello,中断子线程的休眠
            for (int i = 0; i < 5; i++) {
                Thread.sleep(1000);
                System.out.println("hello" + ", 第" + (i+1) + "次");
            }
    
            //当执行到这里,就会中断cat线程的休眠
            cat.interrupt();
        }
    }
    
    class Cat extends Thread{
    
        @Override
        public void run() {// 自定义线程类
            while (true){
                for (int i = 0; i < 100; i++) {
                    System.out.println(Thread.currentThread().getName() + ": 喵喵喵~~~" + ", 第" + (i+1) + "次");
                }
                try {
                    //休眠20秒
                    System.out.println(Thread.currentThread().getName() + "正在sleep");
                    Thread.sleep(20000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    //当线程执行到一个interrupt方法时,就会catch一个异常
                    System.out.println(Thread.currentThread().getName() + "被interrupt");
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述

    🐰 说明:

     上述案例,每次进行cat线程时,都会打印100次喵喵喵,然后进入20秒的休眠。但是主线程中,每进行5次打印hello后,就会对cat线程进行中断,此时cat线程的休眠中断,继续执行打印100次喵喵喵的操作。


    4 线程插队

    线程插队主要通过 join 来实现。 要求如下:
    1.创建一个子线程,每隔1s输出hello,输出10次,主线程每隔1s,输出hi,输出10次;
    2.两个线程同时执行,当主线程输出5次后,就让子线程运行完毕,主线程继续。

    🐱 示例代码及结果:

    /**
     * @author 兴趣使然黄小黄
     * @version 1.0
     * 线程插队
     */
    public class ThreadJoinTest {
        public static void main(String[] args) throws InterruptedException{
            Thread thread = new Thread(new SonTread());
            thread.start();
            for (int i = 0; i < 10; i++) {
                System.out.println("hi" + (i+1));
                Thread.sleep(1000);
                if(i == 4){
                    thread.join();
                }
            }
        }
    }
    
    class SonTread implements Runnable{
    
        int count = 0;
        @Override
        public void run() {
            while (count < 10){
                System.out.println("hello" + (++count));
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    🐰 说明:

     上述案例中,主线程和子线程一同工作,当主线程的hi打印完毕第五个时,主线程中断,让子线程先继续打印完毕10个hello,而后主线程继续完成之前的工作。


    写在最后

    🌟以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
    如果有问题,欢迎私信或者评论区!
    在这里插入图片描述

    共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”
    在这里插入图片描述

  • 相关阅读:
    贪心算法题
    phpstudy 安装 flarum论坛
    mongoDB 优化(1)索引
    ERP系统:帮助企业实现一体化管理
    考研C语言复习进阶(2)
    编程练习【破环回文数】
    在Windows中安装MinGW-w64最新版本(目前12.1.0)
    如何用Java高效地存入一万条数据?这可能是你面试成功的关键!
    uniapp之消除图片的空白占用空间
    视频压缩文件太大了怎么缩小?别怕,视频压缩我有利器
  • 原文地址:https://blog.csdn.net/m0_60353039/article/details/126659946