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

发布于:2022-12-29 ⋅ 阅读:(481) ⋅ 点赞:(0)

💁 个人主页:黄小黄的博客主页
❤️ 支持我:👍 点赞 🌷 收藏 🤘关注
🎏 格言: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;
    }
}

在这里插入图片描述


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");
            }
        }
    }
}

在这里插入图片描述

🐰 说明:

 上述案例,每次进行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();
            }
        }
    }
}

在这里插入图片描述

🐰 说明:

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


写在最后

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

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


网站公告

今日签到

点亮在社区的每一天
去签到