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

相关文章
|
22天前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
46 1
|
5天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
24 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
7天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
24 10
|
14天前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。
|
22天前
|
监控 安全 Java
Java多线程调试技巧:如何定位和解决线程安全问题
Java多线程调试技巧:如何定位和解决线程安全问题
68 2
|
25天前
|
存储 安全 Unix
并发编程基础:使用POSIX线程(pthread)进行多线程编程。
并发编程基础:使用POSIX线程(pthread)进行多线程编程。
49 0
|
28天前
|
存储 安全 Java
【多线程面试题十七】、如果不使用synchronized和Lock,如何保证线程安全?
这篇文章探讨了在不使用`synchronized`和`Lock`的情况下保证线程安全的方法,包括使用`volatile`关键字、原子变量、线程本地存储(`ThreadLocal`)以及设计不可变对象。
【多线程面试题十二】、阻塞线程的方式有哪些?
线程阻塞的方式包括调用sleep()方法、阻塞式IO操作、等待同步监视器的获取、等待通知(notify),以及慎用的suspend()方法。
|
28天前
|
存储 安全 Java
【多线程面试题 七】、 说一说Java多线程之间的通信方式
Java多线程之间的通信方式主要有:使用Object类的wait()、notify()、notifyAll()方法进行线程间协调;使用Lock接口的Condition的await()、signal()、signalAll()方法实现更灵活的线程间协作;以及使用BlockingQueue作为线程安全的队列来实现生产者和消费者模型的线程通信。