首页 > 其他分享 >【多线程】start 和 run 区别,终止线程,等待线程

【多线程】start 和 run 区别,终止线程,等待线程

时间:2024-12-16 12:57:14浏览次数:6  
标签:isQuit run Thread 代码 start 线程 sleep 多线程

Thread 类使用 start 方法,启动一个线程,对于同一个 Thread 对象来说,start 只能调用一次!!!

不怕名字起的长,就怕含义不清楚!

想要启动更多线程,就是得创建新的对象!!!

调用 start 创建出新的线程,本质上是 start 会调用 系统的 api,来完成创建线程的操作。

start 和 run 的区别(重点):

终止线程:

不能说是中断一个线程,中断这个词有很多含义,操作系统底层也有中断概念,CPU上/各种设备也有中断概念。

更好的说法是:终止一个线程(让线程 run 方法【入口方法】执行完毕)

main 方法对应的是主线程!

怎么让线程提前结束?

核心就是让 run 方法能够提前就结束 => 取决于 具体代码实现方式

为了让线程结束,引入标志位

package thread;

public class ThreadDemo12 {
    private static boolean isQuit = false;

    public static void main(String[] args) {
        // boolean isQuit = false;

        Thread t = new Thread(() -> {
            while (!isQuit) {
                System.out.println("我是一个线程, 工作中!!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 当前是死循环, 给了个错误提示.
            System.out.println("线程工作完毕!");
        });

        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        isQuit = true;
        System.out.println("让 t 线程结束!");
    }
}

通过上述代码,就可以让线程结束掉。具体线程什么时候结束,取决于在另一个线程中何时修改 isQuit 的值。

main 线程想要让 t 线程结束,大前提一定是 t 线程的代码,对这样的逻辑有所支持。而不是 t 里的代码随便怎么写都能提前结束。如果代码不配合,main 无法让 t 提前结束。

run方法和main方法是两个线程,这两个线程的执行顺序是不确定的!!!

上面的写法不够优雅,Thread 类提供了一种更优雅的选择。让 Thread 对象内置了这个变量。

这个代码本质上就是使用 Thread 实例,内部自带的标志位来代替刚才手动创建的 isQuit 变量了。

如果没有 sleep,interrupt 可以让线程顺利结束,有 sleep 引起了变数!

在执行 sleep 的过程中,调用 interrupt,大概率 sleep 休眠时间还没到,被提前唤醒了。

提前唤醒,会做两件事:

1.抛出 InterruptedException(紧接着就会被 catch 获取到)

2.清除 Thread 对象的 isInterrupted 标志位

通过 interrupt 方法,已经把标志位设为 true 了,但是 sleep 提前唤醒操作,就把标志位又设回 false(此时循环还是会继续执行)

要想让线程结束,只需要在 catch 中加上 break 就行了

这个日志是代码中打出来的,如果不写打印就不会存在了

sleep 清空标志位,是为了给程序员更多的“可操作空间”

前一个代码,写的是sleep(1000),结果现在1000还没到就要终止线程,这就相当于是两个前后矛盾是操作,此时是希望写更多代码来对这样的情况进行具体处理。

此时程序员可以在 catch 语句中,加入一些代码,来做一些处理:

(1)让线程立即结束(加上 break)

(2)让线程不结束,继续执行(不加 break)

(3)让线程执行一些逻辑之后再结束(写一些其他代码,再 break)

等待线程:

标签:isQuit,run,Thread,代码,start,线程,sleep,多线程
From: https://blog.csdn.net/weixin_74146322/article/details/144277398

相关文章

  • Java之线程总结、String类
    1、线程的总结  1)栈管运行,堆管存储    2)线程的生命周期jdk5.0之前jdk4.0之后有一个枚举类型来表示生命周期的状态java.lang.Thread.State 3)  需要考虑非静态的是否唯一,如果不唯一改成静态4)饿汉式线程安全,不同线程运行同......
  • TrunNas教程网址导航
    TrunNas教程网址导航文字教程[TrueNas安装保姆教程1](TruenasScale23.10安装设置保姆教程1_NAS存储_什么值得买)[TrueNas安装保姆教程2](TruenasScale23.10设置保姆教程2(NFS和iSCSI共享)_网络存储_什么值得买)[TrueNas基础教程数据保护](TruenasScale23.10设置保姆......
  • Neo4j - Run a docker container
     zzh@ZZHPC:~$dockerpullneo4j:latest zzh@ZZHPC:~$dockerrun\--publish=7474:7474--publish=7687:7687\--volume=$HOME/neo4j/data:/data\-dneo4j HowtousethisimageYoucanstartaNeo4jcontainerlikethis:dockerrun\......
  • 线程池C++11实现
    设计思路tasks:任务队列,每当有新任务时,就addTask到该队列workers:工作线程,不断地从tasks中取任务执行queueMutex:任务队列互斥锁,防止在addTask时出现冲突condition_variable:条件变量,当任务队列为空时阻塞线程,等待任务被添加进队列function<void()>:函数对象,tasks队列......
  • java如何请求接口然后终止某个线程
    Java请求接口并终止线程在Java开发中,处理多线程操作是常见需求。有时我们需要在请求某个接口后,根据接口返回结果或其他条件,终止某个线程的执行。本文将详细介绍如何在Java中请求接口并终止特定线程的方法。一、请求接口1.1使用 HttpURLConnectionJava提供了多种方式进行HTTP......
  • JavaEE 【知识改变命运】05 多线程(4)
    文章目录单例模式什么是单例模式饿汉模式懒汉模式多线程-懒汉模式分析多线程问题第一种添加sychronized的方式第二种添加sychronized的方式改进第二种添加sychronized的方式(DCL检查锁)阻塞队列什么是阻塞队列什么是消费生产者模型标准库中的阻塞队列消息队列应用的场景......
  • C# OnnxRuntime 实现百度网盘AI大赛-表格检测第2名方案第二部分-表格分割
    目录说明效果模型项目代码参考下载说明百度网盘AI大赛-表格检测的第2名方案。该算法包含表格边界框检测、表格分割和表格方向识别三个部分,首先,ppyoloe-plus-x对边界框进行预测,并对置信度较高的表格边界框(box)进行裁剪。裁剪后的单个表格实例会送入到DBNet中进行语......
  • 深入理解 Virtual Threads(虚拟线程)
    Java作为一种流行的编程语言,其生态系统在不断进化,尤其是在最新的版本中引入了许多令人兴奋的功能。本文将为您深入讲解Java的最新技术之一——VirtualThreads(虚拟线程),并探讨其在实际项目中的应用价值。什么是VirtualThreads?VirtualThreads是Java平台为解决高并发问......
  • 在 Windows 操作系统中,Runtime Broker 和 Background Task Host 是两种常见的进程和服
    在Windows操作系统中,RuntimeBroker和BackgroundTaskHost是两种常见的进程和服务,它们在后台运行并执行与系统和应用相关的一些任务。它们对于系统的正常运行非常重要,通常不需要用户干预。下面是它们的详细说明:1. RuntimeBroker是什么?RuntimeBroker是一个Windows系......
  • 《宇宙机器人》vcruntime140_1.dll无法执行快速修复方法
    《宇宙机器人》vcruntime140_1.dll无法执行快速修复方法TGA2024落幕,年度最佳游戏——《宇宙机器人》,今天,我将为大家科普电脑游戏运行时可能出现的一些问题,尤其是文件丢失、文件损坏和系统报错,并以《宇宙机器人》游戏无法执行vcruntime140_1.dll文件为例,提供一系列快速修复方法......