JavaWeb语法二:Thread类的基本使用

news2024/11/26 5:19:44

目录

1.创建线程

1.2:run()和start()方法

1.3:Thread的几个常见属性

2.线程的有关操作

2.1:启动一个线程:start()

2.2:中断一个线程

2.2.1:使用自定义的变量来作为标志位

2.2.2:使用Thread.interrupted()代替自定义标志位

2.2.3:标志位不会被清除 Thread.currentThread().isInterrupted()

2.3:等待一个线程  join()

2.4:获取当前线程引用  currentThread()

2.5:休眠当前线程 slepp()


前言:

在前一篇我们了解了何为线程和进程,并大致的知道线程和进程之间的区别和联系,今天我们进一步的来了解线程,该怎么创建一个线程。

1.创建线程

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("这里是继承Thread来创建一个线程类");
    }
}
//实现Runnable接口来创建线程
class  MyRunnable implements   Runnable{
    @Override
    public void run() {
        System.out.println("实现Runnable接口来创建一个线程类");
    }
}
public class ThreadDemo1 {
    public static void main(String[] args) {
        //继承Thread来创建一个线程类
        MyThread thread=new MyThread();
        thread.start();
        //这里就是描述一个任务
        MyRunnable runnable=new MyRunnable();
        //把任务交给一个线程来完成。
        Thread thread1=new Thread(runnable);
        thread1.start();
        //利用lambda来创建一个线程
        Thread thread2=new Thread(()->{
            System.out.println("这是lambda来创建一个线程。");
        });
        thread2.start();
    }
}

 看代码,里面有很多run(),start()方法,为啥有这些呢?接下来我们来进一步了解run()方法,start()方法


1.2:run()和start()方法

1. start()是真正的操作系统中创建一个新的线程。是真正的实现了多线程。

2. start()方法启动线程后自动调用run()方法。

3. run()方法只是描述了线程要干的活是啥,如果在main中调用run()方法,此时run()只是Thread类的一个普通的方法。并不会创建一个新的线程。

4. run()方法执行完毕后,start()创建的这个新线程会立马销毁,Thread对象但依旧存在(对象的生命周期和系统内核的线程并非完全一致)。

1.3:Thread的几个常见属性

1.ID  getId():

ID是线程的唯一标识,不同线程不会重复。

2.名称 getName():

3.是否后台线程:isDaemon():

后台线程又叫做守护线程,main默认是前台线程,JVM自带的线程都是后台线程。JVM会在一个进程的所有非后台线程结束后,才会结束运行。前台线程会阻止进程结束,前台线程的工作没做完,进程是结束不了的。

4.是否存活:isAlive():

这个是判断内核里面的PCB是否在干活,是在判断当前系统里面的这个线程是不是真的存在。也可以简单的理解,run()方法是否允许结束了。

2.线程的有关操作

2.1:启动一个线程:start()

前面已经讲述了,这里就不在讲述呢

2.2:中断一个线程

这里的中断,并不是让一个线程立即停止下来,而是通知线程,你该停下来了,但至于这个线程会不会停下来,是取决线程自己的(线程内部的代码)。

2.2.1:使用自定义的变量来作为标志位

public class ThreadDemo2 {
    private  static  boolean flag=false;
    public static void main(String[] args) throws InterruptedException {
     Thread t1=new Thread(()->{
            while(!flag){
                System.out.println("没被发现,可以继续潜伏");
            }
         System.out.println("快撤!!");
     });
     t1.start();
     Thread.sleep(1);
     flag=true;
    }
}

2.2.2:使用Thread.interrupted()代替自定义标志位

为true:就是被终止了

public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){
                System.out.println("她不在,可以继续布置");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("她来了,快撤");
        });
        t1.start();
        Thread.sleep(1);
        t1.interrupt();//这个就是将t1这个线程中断
    }
}

这里Thread.currentThread():是可以获取当前的线程。

使用Thread.isInterrupted():是会把sleep()方法提前唤醒。

 public static void main(String[] args) throws InterruptedException {
        System.out.println("原本的中断标志位为:"+Thread.interrupted());
        //这里打印出来Thread.interrupted()是false;
        Thread t1=new Thread(()->{
            for (int i = 0; i <3; i++) {
                System.out.println("现在的中断标志位为"+Thread.interrupted());
            }
        });
        t1.start();
        t1.interrupt();//这里是将中断标志位设置为true;
    }

Thread.isInterrupted()  判断当前线程的中断标志被设置后,会清除自己设置的中断标志,使中断标志恢复原来。就像弹簧一样,按下去,就自己恢复到原来的长度。


2.2.3:标志位不会被清除 Thread.currentThread().isInterrupted()

public static void main(String[] args) throws InterruptedException {
        System.out.println("原本的中断标志位为:"+Thread.interrupted());
        //这里打印出来Thread.interrupted()是false;
        Thread t1=new Thread(()->{
            for (int i = 0; i <3; i++) {
                System.out.println("现在的中断标志位为"+Thread.currentThread().isInterrupted());
            }
        });
        t1.start();
        t1.interrupt();//这里是将中断标志位设置为true;
    }

Thread.currentThread().isInterrupted(): 判断指定线程的中断标志被设置,不会清除设置的中断标志位。就像闹钟响了,你把闹钟暂停了,但过一会儿还是回响。


2.3:等待一个线程  join()

线程是一个随机调度的过程,而等待一个线程就是控制线程的结束顺序。


join()  等待t1线程结束,t1线程不结束,main线程就进入阻塞状态.如果在执行join()之前,t 已经结束了,main这个线程就不会阻塞,直接往下走。

 

这里为啥不一样呢?

join(参数)这里是毫秒,意思就是我最多等待多久,你来晚了,我就走了。这里只看你设置的参数是多久。但是在我设置等待的时间内t1线程已经结束了,main线程也不会继续处于阻塞状态,也会立马运行下去。 


2.4:获取当前线程引用  currentThread()

  public static void main(String[] args) {
        Thread thread=Thread.currentThread();//获取当前线程
        System.out.println(thread.getName());
    }

在哪个线程中调用,就可以获取到当前线程的实例。getName()获取到线程的名字。

如上代码,的结果就是main。

2.5:休眠当前线程 slepp()

休眠当前线程就用Sleep(),它的举例已经在上面使用过了。这里就不在举例了。

总结:

以上就是我总结的线程的知识点,若有错的,或是不太准确的,请各位铁子留言指错,若感觉不错,请一键三连。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高校校园网络

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;开发工具IDEA-2020.1,数据库mysql55.527,SSM框架&#xff0c;jdk版本"1.8.0_74"&#xff0c;java语言。 管理员…

小白年薪26万,为什么Python岗位的薪资越来越高?问题解析

人工智能和大数据概念的兴起&#xff0c;带动了Python的快速增长——Python语言逻辑简洁、入门简单、生态丰富&#xff0c;几乎成为几个新兴领域的不二选择。而除了这两个领域&#xff0c;Python还有更多的适用领域&#xff1a;爬虫、web、自动化运维等领域都非常适合Python发挥…

大二学生HTML期末作业、个人主页网页制作作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

代码随想录第八天

专题&#xff1a;字符串 题目&#xff1a; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所…

CleanMyMacX4.15好用吗?CleanMyMac X2023安全吗?

CleanMyMac x4.15已经正式发布&#xff0c;作为最新的系统清理和应用管理软件&#xff0c;可以让用户一键智能化清理Mac电脑&#xff0c;自动扫描Mac上的所有文件&#xff0c;包括&#xff1a;Mac系统清理、邮件应用程序清理、大和旧型文件清理、itunes文件清理、废纸篓清理、应…

【总结】少信那些个包发论文的营销文案,7场直播讲解如何锻炼基础的学术研究能力...

对于广大研究生甚至本科生来说&#xff0c;发表满足学校或者实验室要求的公开学术论文是毕业要求&#xff0c;多少都会具有一定的压力&#xff0c;尤其是一些学校实验室要求比较高。作为过来人&#xff0c;其中焦虑有三也是懂的&#xff0c;研究生期间为此焦虑过一两年。正应如…

安科瑞ARB5弧光保护装置非电量保护装置故障告警可选配GOOSE

安科瑞 王晶淼/刘芳 一、ARB5系列弧光保护装置概述 ARB5系列弧光保护装置外观时尚、大屏幕液晶显示&#xff0c;图形化多语言菜单&#xff0c;操作快捷方便&#xff1b;具有强大的功能集成&#xff1a;集保护、测量、控制、监测、通讯、故障录波、事件记录等多种功能于一体,准…

时间序列-预测(Forcasting):时间序列预测算法总结

一、背景介绍 绝大部分行业场景,尤其是互联网、量化行业,每天都会产生大量的数据。金融领域股票价格随时间的走势;电商行业每日的销售额;旅游行业随着节假日周期变化的机票酒店价格等; 我们称这种不同时间收到的,描述一个或多种特征随着时间发生变化的数据,为时间序列…

如何完全的卸载ArcGIS?

打开控制面板&#xff0c;找到“卸载程序” 选择卸载程序&#xff0c;在新界面中找到与ArcGIS有关的程序。 右键单击要卸载的内容&#xff0c;并选择“卸载/更改”。按照此方法&#xff0c;把要卸载的软件一个个的卸载掉。 通过以上步骤&#xff0c;我们就把ArcGIS软件从电脑中…

酷早报:12月14日全球Web3加密行业重大资讯大汇总

2022年12月14日 星期三 【数据指标】 加密货币总市值&#xff1a;$0.88万亿 BTC市值占比&#xff1a;39.15% 恐慌贪婪指数&#xff1a;30 恐慌【今日快讯】 1、【政讯】 1.1、拜登&#xff1a;通胀正在下降&#xff0c;一切都在朝着正确的方向发展 1.2.1、贝莱德&#xff1a;11…

ChatGPT:探索RLHF与GPT的完美结合

前言 ChatGPT已经发布一周了热度依旧不减&#xff0c;ChatGPT也各种大显神通&#xff0c;为各大网友“出谋划策”&#xff0c;有写周报的&#xff0c;有写绩效的甚至还有写论文的&#xff0c;作为一个NLP从业者&#xff0c;除了好好体验下其中的乐趣&#xff0c;其背后的原理当…

基于Java实现(APP)智能停车场管理系统【100010044】

移动应用开发系统设计说明书 服务集成流程详细设计 实现功能 序号功能点描述1新增用户2注册用户3修改场地信息4列出场地信息5新增认证车辆6列出认证车辆7删除认证车辆8车辆进入信息录入9停车记录列表展示10出停车场信息录入 参数说明 User 用户信息实体参数 字段名称字段类…

壳聚糖-三聚磷酸钠(CTS-STPP)|SN-117M标记甘露糖偶联葡聚糖胺

壳聚糖-三聚磷酸钠(CTS-STPP)|SN-117M标记甘露糖偶联葡聚糖胺 中文名称&#xff1a;壳聚糖-三聚磷酸钠 英文名称&#xff1a;CTS-STPP 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体 包装&#xff1a;瓶装/袋装…

实战 | 基于OpenCV的停车场空余车位实时监测系统(详细步骤 + 源码)

导 读 本文主要介绍如何使用Python和OpenCV实现一个停车场空余车位实时监测系统&#xff0c;并包含详细步骤和源码。 背景介绍 介绍实现步骤之前&#xff0c;先来看看测试视频(小型停车场实时监控画面)&#xff1a; &#xff0c;时长00:28 我们的目标是实时检测停车场剩余空位…

DAMA-CDGA/CDGP数据治理工程师证书含金量杠杠滴

DAMA-CDGA/CDGP数据治理工程师证书含金量杠杠滴 DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&a…

Linux常用操作 | 权限网络进程主机... | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘Linux。。。 下面是我总结的 Linux 知识的初阶版思维导图&#xff0c;后续会不断补充 文章目录Linux常用操作软件安装systemctl软链接日期时区ntpip地址主机名配置VMware固定IPps命令kill命令nmap命令netstat命令ping命令wget命令curl命令top命令df命令iosta…

Ubuntu 建立 http server

1.執行 sudo apt install apache2 2.檢查Apache sudo systemctl status apache2 看到active說明運行正常 3.調整UFW防火牆 允許Apache遠端連接 查看 sudo ufw app list 允許HTTP/HTTPs傳輸 sudo ufw allow in "Appach Full" 4.測試 在網頁上打開 http://{你的…

汇编伪指令

目录 段的定义&#xff08;重点&#xff09; 定位方式 汇编地址计数器 $ ORG 例题 段寄存器的设定&#xff08;重点&#xff09; 源程序的结束&#xff08;重点&#xff09; 过程的定义&#xff08;了解&#xff09; 掌握 过程定义伪指令 PROC&#xff0c; ENDP 段定…

QT—常用容器 QStringList,QVector,QMap,QHash,QVariant

QStringList 元素添加 可以直接添加元素&#xff0c;也可也使用append( )方法在末尾追加元素 QStringList weekList<<"星期一"<<"星期二"<<"星期三"; weekList.append("星期四"); qDebug()<<weekList; 元素…

LeetCode刷题复盘笔记—一文搞懂动态规划之123. 买卖股票的最佳时机 III问题(动态规划系列第二十二篇)

今日主要总结一下动态规划的一道题目&#xff0c;123. 买卖股票的最佳时机 III 题目&#xff1a;123. 买卖股票的最佳时机 III Leetcode题目地址 题目描述&#xff1a; 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能…