【Java|多线程与高并发】 使用Thread 类创建线程的5种方法如何查看程序中的线程

news2024/12/23 13:09:52

文章目录

  • 前言
  • 线程创建
    • 1.继承Thread类重写run()方法
  • 如何查看程序中的线程?
    • 2.实现Runnable接口
    • 3.使用匿名内部类,继承Thread
    • 4.使用匿名内部类,实现Runnable
    • 5.⭐使用Lambda表达式,创建线程(重要)
  • Thread 的常见构造方法
  • 总结

前言

在这里主要补充说明一些问题,方便更好地理解下面的内容:

1.关于多线程存在有什么意义以及多线程存在有什么好处?

多线程编程主要是为了更好地解决并发编程这个问题,因为创建销毁调度一个进程开销比较大(消耗资源多和速度慢),进程之所以开销比较大,主要是在"资源的分配和回收上"
而线程也被称为"轻量级进程",因此在解决并发编程这个问题上,线程的创建销毁调度的更快一些.

2.线程和进程的关系

一个进程可以有一个线程,也可以有多个线程,但是不能没有线程
在启动线程时,只有第一个线程的开销比较大,后面的开销就很小了
在不支持线程的操作系统中,进程既是资源分配的基本单位,也是调度的基本单位;在拥有线程的操作系统中,线程是调度的基本单位,而进程是资源分配的基本单位
系统级线程的切换需要内核的支持,用户级线程的切换不需要内核的支持。同一进程中的线程共享同一物理内存空间。

3.增加线程的数量,能否提高执行速度

增加线程的数量不一定能提高速度,因为CPU核心数是有限的,如果创建线程太多,不小的开销主要在调度上浪费了

4.其它的一些知识点

线程就是独立的执行路径
main()线程也称为主线程,为系统的入口,执行整个程序,由JVM进行创建
程序运行时,即使没有手动创建线程,后台也会有多个线程,如:主线程,gc线程
在一个进程中,线程是抢占式执行,各个线程的执行顺序是不确定的

Java多线程中,最核心的类就是Thread类,而使用Thread类不需要导入任何类型的包,因为它是在java.lang包下,默认是导入的 线程主要是为了更好地解决并发编程的问题

线程创建

线程的创建有5种方法,下面为大家一一介绍这些创建线程的方法

1.继承Thread类重写run()方法

//创建线程 方法1:继承Thread 重写run方法
class MyThread extends Thread{
    @Override
    public void run() {
        while(true){
            System.out.println("run方法在执行");
        }
    }
}
public class ThreadDemo1 {
    public static void main(String[] args) {
        Thread thread = new MyThread();
        thread.start();//这里要注意
        while(true){
            System.out.println("main方法在执行");
        }
    }
}

代码执行的一小段结果如下:
在这里插入图片描述

在创建好thread这个实例对象之后,调用的方法是start方法,而不是run方法,调用start方法是为了创建一个线程,由这个新的线程去调用thread.run方法,在run方法执行完毕后,创建的这个新的线程就自动销毁了,如果直接调用thread方法,是不会有新的线程的
程序执行流程图区别如下:
在这里插入图片描述
对于上述代码来说,如果只是调用thread.run()方法,那么程序只会一直打印"run方法在执行",不可能会打印"main()方法在执行"

如何查看程序中的线程?

为了更好地看到线程,Java也为我们提供了方法,我们可以使用jdk中自带的工具jconsole来查看当前进程中的所有线程
在查看线程时要运行你想要查看程序的main方法
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果打开jconsole.exe之后什么都看不到,可以尝试以管理员方式运行

2.实现Runnable接口

实现Runnable接口,要重写的方法也是run()方法

//Runnable 描述一个"要执行的任务"
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("hello Thread");
    }
}
public class TreadDemo2 {
    public static void main(String[] args) {
        Runnable runnable = new MyRunnable();//描述了一个任务
        Thread thread = new Thread(runnable);//把任务交给线程来执行
        thread.start();
    }
}

这样的写法最大的好处就是解耦合,目的是为了将任务和线程之间分开

3.使用匿名内部类,继承Thread

public class ThreadDemo3 {
    public static void main(String[] args) {
        Thread thread = new Thread(){
            @Override
            public void run() {
                System.out.println("hello thread");
            }
        };
        thread.start();
    }
}
  • 这里new Thread() 是创建了一个Thread的子类,没有名字,所以是匿名,并让thread指向这个子类对象

4.使用匿名内部类,实现Runnable

public class ThreadDemo4 {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello thread");
            }
        });//注意()
        thread.start();
    }
}
  • 这个写法是创建了一个子类,实现了Runnable接口,同时创建了类的实例,并传给Thread的构造方法

5.⭐使用Lambda表达式,创建线程(重要)

这种创建线程的方法最简单,在平时使用的时候,使用Lambda表达式创建线程是最常用的,所以这种线程的创建方式要务必掌握!!!

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

Thread 的常见构造方法

Thread 的常见构造方法常见的构造方法有四种

构造方法说明
Thread()创建线程对象
Thread(Runnable target)使用 Runnable 对象创建线程对象
Thread(String name)创建线程对象,并命名
Thread(Runnable target, String name)使用 Runnable 对象创建线程对象,并命名

这里着重说一下第三种和第四种构造方法, 这两种构造方法可以给线程命名.给线程命名的最大好处就是当程序中创建了很多的线程,而程序中地某个线程中出现问题,可以更好地进行调试,更快地找到问题所在.

总结

  • 掌握线程创建的方法,特别是用Lambda表达式创建线程的方法(最简单也最常用)
  • 掌握start()和run()方法之间的区别

在这里插入图片描述

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

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

相关文章

conda安装nodejs版本过低解决方法

conda命令直接安装nodejs时,可能会由于镜像源中nodejs版本过低导致没法安装高本版的nodejs,导致无法jupyterlab使用一些扩展插件。 解决方法如下:(windows环境下直接按提示下载版本安装就行,此处只介绍linux环境的解决…

2023上半年软考中级系统集成项目管理工程师2月25日开班

系统集成项目管理工程师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职…

今天面试招了个28K的人,从腾讯出来的果然都有两把刷子···

公司前段时间缺人,也面了不少测试,前面一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在20~30k,面试的人很多,但平均水平很让人失望。看简历很多都是4年工作经验,但面试中,不…

2023年上半年软考高项信息系统项目管理师2月25日开班

信息系统项目管理师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资…

每天一道大厂SQL题【Day09】充值日志SQL实战

每天一道大厂SQL题【Day09】充值日志SQL实战 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&#…

MMDetection(五)

目标检测工具包 MMDetection MMDetection 可以做什么 ➢ MMDetection 提供 400 余个性能优良的预训练模型,开箱即 用,几行 Python API 即可调用强大的检测能力 ➢ MMDetection 涵盖 60 余个目标检测算法,并提供方便易用的 工具,…

【Spring Cloud】如何修改Feign的日志记录级别

本期目录前言1. 介绍2. 方式一:配置文件1)全局生效2)局部生效3. 方式二:Java代码1)全局配置2)局部配置前言 本次示例代码的文件结构如下图所示。 1. 介绍 Feign 允许我们自定义配置,下面是 …

kubernetes集群部署springcloud项目【AL】【未写完】

kubernetes集群部署springcloud项目【AL】 (先手工做,非自动化) #环境: 192.168.73.138 master 192.168.73.139 node1 192.168.73.140 node2 192.168.73.137 harbor、mysqlgit clone https://github.com/lizhenliang/simple-…

leetcode.1234 替换子串得到平衡字符串 - 反向滑动窗口

1234. 替换子串得到平衡字符串 题目: 有一个只含有 Q, W, E, R 四种字符,且长度为 n 的字符串。 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。 给你一个这样的字符串 s,请通过「替换…

信息安全管理

信息安全管理信息安全管理信息安全风险管理信息安全管理体系应急响应与灾难恢复应急响应概况信息系统灾难修复灾难恢复相关技术信息安全管理 管理概念:组织、协调、控制的活动,核心过程的管理控制 管理对象和组成:包括人员在内相关资产&…

【ArcGIS Pro二次开发】(3):UI管理_显示隐藏Tab、Group、Control等控件

在ArcGIS Pro工作中,有时候会涉及到工具栏UI的管理,比如,打开模型构建器时,工具栏才会出现新的选项卡(Tab)【ModelBuilder】,工程未做更改,则【保存】按钮显示灰色不可用。 下面以一个小例子来学习一下。 一…

VScode+cuda编程:常见环境问题

VScodecuda:常见环境配置问题1、VScode终端问题(PS)2、编译问题(CUDA版本过低)3、nvcc编译问题(arch架构)1、VScode终端问题(PS) 问题描述: 在VScode下打开终端执行nvcc指令,发现执行不了,但是在外部终端powershell和cmd都可以。…

波奇学c语言:代码的编译和链接

test.c(源文件)->编译->test.obj(目标文件)->链接->test.exe(可执行文件)编译1.预编译(预处理):text.c->text.i使用gcc -E test.c 进行停止预处理指令&am…

Java修饰符和运算符,超详细整理,适合新手入门

目录 一、访问控制修饰符 1、访问权限 二、运算符 1、算术运算符 2、关系运算符 3、逻辑运算符 4、赋值运算符 5、三元运算符 一、访问控制修饰符 Java 支持 4 种不同的访问权限: private 私有的 protected 受保护的 public 公共的 default 默认 1、…

【手写 Vuex 源码】第九篇 - Vuex 响应式数据和缓存的实现

一,前言 上一篇,主要介绍了 Vuex 的 State 状态安装,主要涉及以下几个点: State 状态的安装逻辑;两个核心问题的思路;代码实现以及执行情况分析; 本篇,继续介绍 Vuex 模块相关概念…

计算机组成原理(五)

3.理解主存储器与CPU的连接原理;   主存通过数据总线、地址总线和控制总线与CPU连接;   数据总线的位数与工作频率的乘积正比于数据传输率;   地址总线的位数决定了可寻址的最大内存空间;   控制总线(读/写&am…

excel操作实例:如何制作一个学习计划阶段图表

预则立不预则废。不管是为了避免被裁员的窘迫,还是为了获得更高的薪水,都有必要在2023年尽快学精Excel,成为行业高手。教程把要成为Excel高手的几道坎,也是要攻克的目标做成图表,希望大家的努力更有效。要变成Excel高手…

Redis 缓存穿透、缓存击穿和缓存雪崩

Redis 缓存穿透和缓存雪崩 缓存穿透和缓存雪崩这两个概念和知识点我们一定要掌握,因为我们工作中经常会遇到缓存穿透和缓存雪崩的情况。 Redis 缓存穿透(查不到) 缓存穿透是指客户端请求一个缓存和数据库中都不存在的 key。由于缓存中不存在…

【遇见青山】项目难点:集群下的分布式锁问题

【遇见青山】项目难点:集群下的分布式锁问题1.问题简介2.分布式锁分析3.基于Redis实现分布式锁1.0版本4.基于Redis实现分布式锁2.0版本,解决锁误删问题5.基于Redis实现分布式锁3.0版本,解决锁的原子性问题1.问题简介 在《【遇见青山】项目难…

Sliver取代Cobalt Strike成黑客渗透工具“新宠”

8月25日消息,攻击者逐渐弃用Cobalt Strike渗透测试套件,转而使用不太知名的类似框架。开源跨平台工具Sliver正取代Brute Ratel成为受攻击者青睐的武器。 在过去的几年里,Cobal Strike被各类攻击者滥用(包括勒索软件操作&#xff…