【JavaEE】线程的概念

news2024/11/23 4:55:53

文章目录

  • 1、什么是线程
  • 2、进程和线程的区别
  • 3、多线程的概述
  • 4、在Java中实现多线程的方法
    • 1.继承Thread类
    • 2.实现Runnable接口
    • 3.使用匿名内部类来继承Thread类,实现run方法
    • 4.使用匿名内部类来实现Runnable接口,实现run方法
    • 5.使用 lambda表达式


1、什么是线程

线程是进程中实际执行的最小单位,在一个进程中,可以存在一个或者多个线程,同一个进程中的若干线程之间,是共用相同的内存资源和文件资源,线程是系统调度执行的基本单位
利用线程可以解决进程创建/销毁开销大的问题
线程thread也被称为 “轻量级进程” 创建/销毁开销小
线程比进程更轻量,核心在于创建进程可能要包含多个线程,在这个过程中涉及到资源分配/资源释放,创建线程相当于资源已经有了,省去了资源分配/释放步骤
描述进程,使用的PCB这样的结构体,事实上更严格的说,一个PCB其实描述一个线程,若干个PCB联合在一起,是描述一个进程的

2、进程和线程的区别

1.进程是包含线程的,每一个进程至少有一个线程存在,即主线程
2.进程和线程之间不共享内存空间,同一个进程的线程之间共享同一个内存空间
3.进程是系统分配资源的最小单位,线程是系统调度的最小单位
4.一个进程挂了一般不影响其他进程,但是一个线程挂了,可能把同进程内的其他线程一起带走(整个进程崩溃)

3、多线程的概述

多线程是指在一个程序中同时执行多个线程,每个线程可以独立执行不同的任务或者操作,在Java中,多线程可以让程序更高效的利用计算机的多核处理器,提高程序的性能和响应速度,多个线程之间都是并发执行的

4、在Java中实现多线程的方法

1.继承Thread类

创建一个类继承Thread类,重写里面的run方法,在主函数中用start方法启动,这样就创建了一个线程,在调用start方法之后,系统会自动调用重写的run方法,也就是回调函数,交给系统执行run方法

class MyThread extends Thread {
    @Override
    public void run() {
        while (true) {
            System.out.println("hello thread");
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Thread thread = new MyThread();
        thread.start();
        while (true) {
            System.out.println("hello main");
        }
    }
}

运行结果:
在这里插入图片描述
在main中有一个线程,我们称为主线程,主线程是自动创建的,而thread线程是我们手动创建的
多线程的调度顺序是无序的,在操作系统内部也称为“抢占式执行”,任何一个线程,在执行到任何一个代码的过程中,都可以被其它线程抢占掉它的cpu资源,于是cpu就给别的下次执行了,
在这里我们还可以使用 jconsole.exe 这个应用程序,来观察这个多线程代码:
在这里插入图片描述
在这里插入图片描述
点击连接,进入页面之后再点击线程就可以了
在这里插入图片描述
上图表示有多少个线程
在这里插入图片描述
上图圈起来的就表示我们创建的两个线程
剩下的线程都是jvm帮我们做的一些其他工作,涉及到的负责垃圾回收,负责记录调试信息等

2.实现Runnable接口

创建一个类实现Runnable接口,并重写run方法

class MyRunnable implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("hello thread");
    }
}
public class Test2 {
    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.start();

        while (true) {
            System.out.println("hello main");
        }
    }
}

3.使用匿名内部类来继承Thread类,实现run方法

public class Test3 {
    public static void main(String[] args) {
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    System.out.println("hello thread");
                }
            }
        }.start();

        while (true) {
            System.out.println("hello main");
        }
    }
}

4.使用匿名内部类来实现Runnable接口,实现run方法

public class Test4 {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    System.out.println("hello thread");
                }
            }
        });
        
        thread.start();
        while (true) {
            System.out.println("hello main");            
        }
    }
}

5.使用 lambda表达式

public class Test5 {
    public static void main(String[] args) {
        Thread thread = new Thread(()-> {
            while (true) {
                System.out.println("hello thread");                
            }
        });

        //创建线程 启动线程
        thread.start();
        while (true) {
            System.out.println("hello main");            
        }
    }
}

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

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

相关文章

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后,会用yolo v9 来测试一下,看8g 显存能不能跑下来,上次用无影云电脑,4cpu8g内存直接爆了,云电脑也死机了,提示一直占用内存不释放,我自己的云电脑不能占用内…

基于alpha shapes的边缘点提取(matlab)

1、原理介绍 由Edelsbrunner H提出的alpha shapes算法是一种简单、有效的快速提取边界点算法。其克服了点云边界点形状影响的缺点,可快速准确提取边界点。如下图所示,对于任意形状的平面点云,若一个半径为a的圆,绕其进行滚动&…

类加载子系统之类的生命周期(待完善)

0、前言 文中大量图片来源于 B站 黑马程序员 0.1、类加载子系统在 JVM 中的位置 类加载器负责的事情是:加载、链接、解析 0.2、与类的生命周期相关的虚拟机参数 参数描述-XX:TraceClassLoading打印出加载且初始化的类 1、类的生命周期 堆上的变量在分配空间的时…

如何基于nginx搭建https网站

华子目录 使用nginx的http_ssl模块建立加密传输的网站查看配置文件ssl配置文件的主要参数实验:搭建nginxssl加密认证的web服务器 使用nginx的http_ssl模块建立加密传输的网站 查看 [rootserver ~]# nginx -V #查看是否有--with-http_ssl_module模块,如…

2024五一杯:煤矿深部开采冲击地压危险预测 (详细完整思路,已修改)

背景 了解即可 煤炭是中国的主要能源和重要的工业原料。然而,随着开采深度的增加,地应力增大,井下煤岩动力灾害风险越来越大,严重影响着煤矿的安全高效开采。在各类深部煤岩动力灾害事故中,冲击地压已成为威胁中国煤矿…

BigKey的危害

1.2.1、BigKey的危害 网络阻塞 对BigKey执行读请求时,少量的QPS就可能导致带宽使用率被占满,导致Redis实例,乃至所在物理机变慢 数据倾斜 BigKey所在的Redis实例内存使用率远超其他实例,无法使数据分片的内存资源达到均衡 Redis阻…

Vue---router实现路由跳转

Vue—router实现路由跳转 目录 Vue---router实现路由跳转基本使用路由跳转html实现路由跳转JS实现路由跳转 基本使用 所谓路由&#xff0c;就是将一个个组件映射到不同的路由url中 首先要将App内的内容换成router-view // App.vue <template><div id"app"…

商务谈判技巧与口才训练方法(3篇)

商务谈判技巧与口才训练方法&#xff08;3篇&#xff09; 商务谈判技巧与口才训练方法&#xff08;**篇&#xff09;&#xff1a;技巧篇 一、商务谈判技巧 明确目标&#xff1a;在谈判前&#xff0c;明确自己的谈判目标&#xff0c;并设定好底线和期望的谈判结果。 知己知彼…

AIGC技术:现状剖析与未来趋势展望

AIGC技术&#xff1a;现状剖析与未来趋势展望 随着科技的飞速进步&#xff0c;人工智能已经逐渐渗透到我们生活的方方面面。其中&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;技术更是以其独特的魅力和巨大的潜力&#xff0c;引起了业界的广泛关注。本文将深入探…

vue处理查询框清除后无法查询问题,举例为日期选择

例如 在对应的查询方法添加 //我这里获取的是date&#xff0c;如果是其他参数改为其他的即可 if (query.date && query.date.length > 2) {conditions.noedate query.date[0] || conditions.noedate;//获取开始时间conditions.twodate query.date[1] || conditi…

IDEA 开发找到 java-web 发布到 tomcat 的路径

使用 IDEA 开发 java web 应用&#xff0c;有没有遇到需要找到 tomcat 路径的问题 为什么要找 tomcat 路径呢&#xff1f; 拿我的项目来举例&#xff0c;有统一的线上线下 logback.xml 配置&#xff0c;配置时业务、框架日志输出到 file&#xff0c;少量的启动日志输出到 con…

Java进阶-Java Stream API详解与使用

本文全面介绍了 Java Stream API 的概念、功能以及如何在 Java 中有效地使用它进行集合和数据流的处理。通过详细解释和示例&#xff0c;文章展示了 Java Stream API 在简化代码、提高效率以及支持函数式编程方面的优势。文中还比较了 Java Stream API 与其他集合处理库的异同&…

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测 目录 分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测分类效果基本介绍程序设计参考资料分类效果 基本介绍 MATLAB实现LSSVM最小二乘支持向量机多分类预测。最小二乘支持向量机(Least Squares Support Vecto…

数据结构学习/复习1--时间复杂度计算/异或的几个实际用途

一、什么是数据结构和算法 1注&#xff1a;在内存中的存储管理数据 2注&#xff1a;解决问题的方法 二、时间复杂度 1.算法的效率 2.时间复杂度的概念 计算时间复杂度案例1&#xff1a; 计算时间复杂度案例2&#xff1a; 计算时间复杂度案例3&#xff1a; 计算…

如何将本地Android studio项目上传到GitHub

操作步骤&#xff1a; 1、在GitHub上创建账户 2、在androd studio中添加上述创建的GitHub账号 3、在android studio上找到"share project on GitHub"&#xff0c;点击此选项上传当前项目到GitHub 上传成功后&#xff0c;会在GitHub上创建默认仓库repository 注&a…

【R语言数据分析】基本运算与数据导入速查

R语言中命名可以包含英文字母&#xff0c;下划线&#xff0c;数字&#xff0c;点&#xff0c;下划线和数字不能作为名字的开头&#xff0c;点可以开头&#xff0c;但是点开头后面不能跟数字。一般的命名就是只使用英文和下划线就够了。 四则运算 R语言的除法是即使给的两个数…

常用算法代码模板 (2) :数据结构

AcWing算法基础课笔记与常用算法模板 (2) ——数据结构 常用算法代码模板 (1) &#xff1a;基础算法 常用算法代码模板 (2) &#xff1a;数据结构 常用算法代码模板 (3) &#xff1a;搜索与图论 常用算法代码模板 (4) &#xff1a;数学知识 算法基础课 动态规划模板题笔记 算法…

857.雇佣K名工人的最低成本

题目说的其实是有点乱的,所以我们可能抓不住重点,甚至都不太清楚规则,比如 eg. quality[3,1,10,10,1] wage[4,8,200,200,7] 这里是选下标0,1,4 ->单价为8 但是想清楚其实就很easy. 就是 贪心(sort) 优先队列 梳理下我们发现其实要让每个人得到最低期望,就要按照当前最贵…

项目管理-高级项目管理

1.高级项目管理--主要内容 高级项目管理&#xff0c;以下主要从5方面介绍&#xff1a;项目集管理、项目组合管理、组织级项目管理OPM、量化组织管理、项目管理实践模型。 2.具体内容 2.1项目集管理 项目管理绩效域&#xff1a; 包括项目集战略一致性、项目集效益管理、项目集干…

ip地址与硬件地址的区别是什么

在数字世界的浩瀚海洋中&#xff0c;每一台联网的设备都需要一个独特的标识来确保信息的准确传输。这些标识&#xff0c;我们通常称之为IP地址和硬件地址。虽然它们都是用来识别网络设备的&#xff0c;但各自扮演的角色和所处的层次却大相径庭。虎观代理小二将带您深入了解IP地…