【Java EE 初阶】线程的常用方法

news2024/10/7 14:28:03

目录

1.多线程的作用

2.示例:分别对两个变量实现10亿次自增

1.使用串行(单线程)

2.使用并行(多线程)

结果显示:

3.线程的类构造方法

 代码展示:

4.Thread类的常见属性

 1.演示各个属性

 2.演示后台线程

3.演示线程是否存活

4.线程中断

1.通过是否中断的标志位

2. 通过调用Thread类提供的interruped()方法来中断线程

5.线程等待

6.获取当前线程

7.休眠当前线程

 面试题:start()和run()方法的区别?

8.线程状态


1.多线程的作用

使用多线程主要是为了充分利用CPU资源,提升程序运行的效率

2.示例:分别对两个变量实现10亿次自增

1.使用串行(单线程)

    private static void serial() {
        //开始时间
        long start = System.currentTimeMillis();
        long a = 0l;
        for (long i = 0; i < COUNT; i++) {
            a++;
        }

        long b = 0l;
        for (int i = 0; i < COUNT; i++) {
            b++;
        }

        //结束时间
        long end = System.currentTimeMillis();
        System.out.println("串行总耗时"+(end - start));
    }

2.使用并行(多线程)


    private static void concurrency() {
        long start = System.currentTimeMillis();
        //定义两个线程
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                long a = 0l;
                for (long i = 0; i < COUNT; i++) {
                    a++;
                }
                System.out.println("线程1结束");
            }
        });
        Thread t2 = new Thread() {
            @Override
            public void run() {
                long b = 0l;
                for (long i = 0; i < COUNT; i++) {
                    b++;
                }
                System.out.println("线程2结束");
            }
        };

        //启动线程
        t1.start();
        t2.start();
        //等待线程执行完成
        try {
            t1.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        try {
            t2.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        long end = System.currentTimeMillis();
        System.out.println("并行总耗时"+(end - start));
    }

结果显示:

 

 并行的结果比串行的时间短,但又不是串行的二分之一

这说明每创建一个线程都是要消耗时间和资源的

当我们把计算次数改到一万的计算量时:

可以看到串行比并行块

所以并不是所有场景使用多线程都可以提高效率的

具体还是要根据计算量来确定 

3.线程的类构造方法

 代码展示:

public class Demo07 {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Runnable!!!"+Thread.currentThread().getName());
            }
        },"Runnable创建的一个线程");
        Thread t2 = new Thread("Thread创建的线程") {
            @Override
            public void run() {
                System.out.println("Thread!!!"+Thread.currentThread().getName());
            }
        };
        Thread t3 = new Thread(() -> {
            System.out.println("lambda!!"+Thread.currentThread().getName());
        },"lambda创建的线程");
        t1.start();
        t2.start();
        t3.start();
    }
}

4.Thread类的常见属性

 1.演示各个属性

 2.演示后台线程

在线程启动之前设置

                                        

当把线程设置为后台线程之后(守护线程),当main方法结束之后,线程会自动结束

生活中设置业务的线程几乎都是前台线程

处理一些数据不太重要的,容错率较高的业务或辅助业务

3.演示线程是否存活

isAlive()指的是系统的线程(PCB)是否存活,并不是我们创建出来的Thread对象

4.线程中断

停止或中断当前线程的任务

1.通过是否中断的标志位

public class Demo10_Interrupted01 {
    private static boolean isQuit = false;

    public static void main(String[] args) throws InterruptedException{
        Thread thread = new Thread(() -> {
            while (!isQuit) {
                System.out.println("线程~~~~");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程任务结束");
        });
        //启动线程
        thread.start();
        //主线程休眠三秒,模拟子线程正在执行任务
        Thread.sleep(3000);
        // 设置中断标志位为true
        isQuit = true;
        //让子线程先结束
        Thread.sleep(1000);
        System.out.println("主线程结束");
    }
}

2. 通过调用Thread类提供的interruped()方法来中断线程

当线程在阻塞或者Sleep状态时,调用interruped方法,会中断当前Sleep的休眠状态,并抛出异常,只有当线程在RUUNABLE状态时,才会真正的结束线程

在异常中处理

5.线程等待

Jion()

6.获取当前线程

7.休眠当前线程

Thread.sleep(1000);

 面试题:start()和run()方法的区别?

start(),申请一个真正的系统线程

run(),定义线程要执行的任务

1.直接调用run()方法,并不会申请一个真正的系统线程(PCB),只是单纯调用对象的方法

2.调用start()方法,JVM会调用本地方法去系统中真正的申请一个线程(PCB),并执行run()方法中的逻辑

8.线程状态

 

 

 

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

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

相关文章

( 数组和矩阵) 378. 有序矩阵中第 K 小的元素 ——【Leetcode每日一题】

❓378. 有序矩阵中第 K 小的元素 难度&#xff1a;中等 给你一个 n x n n x n nxn 矩阵 m a t r i x matrix matrix &#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第 k 小的元素。 请注意&#xff0c;它是 排序后 的第 k 小元素&#xff0c;而不是第 …

InnoDB存储引擎B+树的树高推导

目录 一、基本结论&#xff1a;InnoDB存储引擎B树的树高3-4层 二、存储引擎B树结构简单分析 三、主键索引B树推导 四、InnoDB页的内部结构推导 五、剖析InnoDB数据文件推导 六、一般思路推导计算B树高度总结 参考文献、书籍及链接 一、基本结论&#xff1a;InnoDB存储引…

uni-app实战笔记

3 页面跳转 点击【成员列表】进入到子页面&#xff0c;这里就涉及到页面跳转。 路由是基础并不难&#xff0c;但是路由跳转的方式比较灵活&#xff0c;这里就需要记录一下。有一点是需要配置的&#xff0c;就是在pages.json中需要将路由整理好&#xff0c;否则页面是无法跳转的…

Hive架构原理以及部署教程

◆了解Hive架构原理 ◆了解Hive和RDBMS的对比 Hive架构原理 Hive架构原理 - 知乎 Hive 是基于 Hadoop 的数据仓库工具&#xff0c;它提供了类 SQL 查询语言 HQL&#xff08;Hive Query Language&#xff09;&#xff0c;可以将 SQL 语句转化为 MapReduce 任务进行数据处理。 Hi…

【软考备战·希赛网每日一练】2023年5月2日

文章目录 一、今日成绩二、错题总结第一题 三、知识查缺 题目及解析来源&#xff1a;2023年05月02日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 三、知识查缺 复习 流水线技术。序列图&#xff08;顺序图&#xff09;用于展现系统中一个用例和多…

剪枝与重参第九课:DBB重参

目录 DBB重参前言1. DBB2. DBB的六种变换2.1 Transform I: a conv for conv-BN2.2 Transform II&#xff1a;a conv for branch addition2.3 Transform III&#xff1a;a conv for sequential convolutions2.4 Transform IV&#xff1a;a conv for depth concatenation2.5 Tran…

【SpringBoot】 整合RabbitMQ 消息单独以及批量的TTL

生产者端 目录结构 导入依赖 修改yml 业务逻辑 队列消息过期 消息单独过期 TTL&#xff08;Time To Live&#xff09;存活时间。表示当消息由生产端存入MQ当中的存活时间&#xff0c;当时间到达的时候还未被消息就会被自动清除。RabbitMQ可以对消息单独设置过期时间也可以对…

爬虫 - QS世界大学排名数据

爬虫 - QS世界大学排名数据 网站简介爬虫方法概述使用工具爬虫概述 第一部分导入需要用到的python包设置selenium控制浏览器打开网页控制鼠标操作定位节点 提取数据滚轮翻页构建循环自动爬取数据数据储存 第二部分导入需要用到的python包获取网页设置请求头读取链接获取网页信息…

TIM-定时器——STM32

TIM-定时器——STM32 TIM(Timer)定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能&#xff0c;而且还包…

K8S第二讲 Kubernetes集群简易版搭建步骤

Kubernetes集群搭建步骤 1&#xff1a;准备物理或虚拟机器 为Kubernetes集群准备物理或虚拟机器。至少需要一个控制节点&#xff08;Master Node&#xff09;和一个工作节点&#xff08;Worker Node&#xff09;&#xff0c;建议使用Linux操作系统。 2&#xff1a; 安装Dock…

1987-2021年全国各省进出口总额数据含进口总额和出口总额

1987-2021年全国各省进出口总额数据含进口和出口 1、时间&#xff1a;1987-2021年 2、范围&#xff1a;包括全国30个省不含西藏 3、指标&#xff1a;进出口总额、进口总额、出口总额 4、单位&#xff1a;万美元 5、来源&#xff1a;各省NJ、JIN rong统计NJ 6、缺失情况说…

递归算法及经典例题详解

大部分人在学习编程时接触的第一个算法应该就是递归了&#xff0c;递归的思想其实很好理解&#xff0c;就是将一个问题拆分为若干个与本身相似的子问题&#xff0c;通过不断调用自身来求解。 但很多新手在实际操作中却很难正确使用到递归&#xff0c;有时面对问题还会有种无从…

win7下java环境搭建以及jdk环境变量配置

很多人在搭建页游、手游时候经常遇到JAVA闪退,基本都是环境变量或者路径错误导致的。本章节主要讲解在win7系统环境下,java环境变量配置方法,java环境配置正确,才可以对apk程序进行反编译运行页游手游。其他操作系统环境变量大同小异参考下就会了。 安装教程: 1、直接运…

让语言学习更简单的 WordFlow

作为一个英语并不是那么特别好的计算机专业学生&#xff0c;长期积累英语的学习对个人发展还是有意义的。简单来说&#xff0c;我在语言上最大的两个问题&#xff0c;一个自己「不理解」&#xff0c;另一个是自己「不会表达」。 上述两个问题主要体现在口语层面&#xff0c;而…

1997-2021年全国30省技术市场成交额(亿元)

1997-2021年全国30省技术市场成交额 1、时间&#xff1a;1997-2021年 2、范围&#xff1a;30省不含西藏 3、来源&#xff1a;国家统计J 4、指标&#xff1a;技术市场成交额 5、缺失情况说明&#xff1a;无缺失 6、指标解释及用途&#xff1a; 技术市场成交额是一个客观、…

YOLOv5 训练自己的数据集

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 ● 难度&#xff1a;夯实基础⭐⭐ ● 语言&#xff1a;Python3、Pytorch3 ● 时间&#xff1a;5月1日-5月6日 &#x1f37a;要求&#xff1…

基于C#开发 B/S架构的实验室管理系统 云LIS系统(MVC + SQLserver + Redis)

一、云LIS系统是将各种样本、免疫、临检、放免、及实验用的分析仪器&#xff0c;通过网络管理和传输实验分析过程中全部数据。对每一专业&#xff0c;实现检验申请、样本采集、样本核收、联机检验、质量控制、报告审核到报告发布的全环节的信息化管理平台。 二、基于B/S架构的云…

【SpringMVC】| SpringMVC注解式开发

目录 一&#xff1a;SpringMVC注解式开发 1. RequestMapping定义请求规则 2. 五种数据提交的方式 3. 请求参数中文乱码解决 4. action方法的返回值 5. SpringMVC的四种跳转方式 6. SpringMVC支持的默认参数类型 7. 日期处理 8. 标签的使用 9. 资源在WEB-INF目录下 一…

常见三种编码方式

常见三种编码方式 1. one-hot 编码2. 虚拟编码3. 效果编码 最近复习一些书&#xff0c;记录一下。在特征工程中&#xff0c;数据集经常会出现分类变量&#xff0c;这时候的分类变量可能是字符型&#xff0c;通常不能直接用于训练模型&#xff0c;这时需要对分类变量进行编码&am…

JavaWeb《CSS》

本笔记学习于Acwing平台 目录 1. 样式定义方式 2.1 行内样式表&#xff08;inline style sheet&#xff09; 2.2 内部样式表&#xff08;internal style sheet&#xff09; 2.3 外部样式表&#xff08;external style sheet&#xff09; 2. 选择器 2.1 标签选择器 2.2 …