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

简介: 文章目录1 线程终止2 线程常用方法2.1 常用方法一览表2.2 方法注意事项3 线程中断4 线程插队写在最后

1 线程终止

🆔 简要说明:

当线程完成任务后,会自动退出;

还可以通过 使用变量来控制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 方法注意事项

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


线程优先级范围:最低优先级为1,正常为5,最高为10;



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


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,而后主线程继续完成之前的工作。

相关文章
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
23 3
|
2月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
20 2
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
34 2
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
38 1
|
2月前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
41 1
|
2月前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
28 1
|
21天前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
55 0
|
2月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
62 6
|
2月前
|
存储 运维 NoSQL
Redis为什么最开始被设计成单线程而不是多线程
总之,Redis采用单线程设计是基于对系统特性的深刻洞察和权衡的结果。这种设计不仅保持了Redis的高性能,还确保了其代码的简洁性、可维护性以及部署的便捷性,使之成为众多应用场景下的首选数据存储解决方案。
42 1
|
2月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
26 0
C++ 多线程之线程管理函数