多线程(一)认识线程和Thread类

13 篇文章 3 订阅
订阅专栏
本文深入探讨了Java线程的基本原理,包括线程的概念、进程与线程的关系、多线程优势、线程状态与创建方式。此外,还介绍了Thread类的构造方法、启动线程、线程属性及常用方法,重点讲解了内存使用在多线程中的注意事项。
摘要由CSDN通过智能技术生成

目录

一、认识线程(Thread)

1、什么是线程?

2、线程和进程的关系

3、多线程的优势

4、线程的状态

5、创建线程的方式

二、Thread类及其常用方法

1、Thread常见的构造方法

2、启动线程

3、线程的属性

4、Thread常用方法

三、多线程(内存的使用)


一、认识线程(Thread)

1、什么是线程?

一个线程就是一个“执行流”,每个线程之间都可以按照顺序执行自己的代码。多个线程之间“同时”执行着多份代码。

线程的实现方式:

  • 内核线程→Java中的线程,是基于内核线程的轻量级实现(轻量级进程:相比于进程,创建、调度、销毁效率要高的多)
  • 用户线程:用程序自己来实现线程,包括线程的调度等。(安卓以前的开发语言时Java,最新的是kotlin(运行在jvm上),里面使用的就是协议(用户线程))

2、线程和进程的关系

  • 进程与进程之间不共享内存空间,同一个进程的线程之间共享同一个内存空间
  • 进程是系统分配资源的最小单位,线程是系统调度的最小单位。
  • 线程的创建、调度、销毁的代价小于进程。
  • 进程包含线程,每个进程至少存在一个线程,即主线程。
  • 线程(出现bug可能导致整个进程挂掉),进程间是独立运行的(可能存在进程通信)

3、多线程的优势

多线程也存在其缺陷:线程的创建/销毁也有一定的开销(一般用于执行耗时比较长的任务);增加了编码的复杂程度。

“并发编程”成为刚需。

  • 充分利用cpu资源,提高执行效率。(单核cou的发展遇到瓶颈,要想提高计算力,就需要多核cpu。并发编程能充分利用多核cpu资源)
  • 有些任务场景需要“等待IO”,使用并发编程此时可以去做其他的事情。

4、线程的状态

线程的多种状态
  1.  new:创建态
  2. runnable:可运行态
    (程序无法判断某个时间是就绪态还是可运行态,所以这两个状态对程序没有意义)
  3. 等待、超时等待、阻塞。(这三种状态的特征都是程序在挂起来等)
  4. 销毁

5、创建线程的方式

(1)继承Thread类

  • 继承Thread来创建一个线程类
         public static void main(String[] args) {
            //继承的写法1.自定义一个类来继承Thread
            //创建一个线程
            MyThread myThread = new MyThread();
            //运行一个线程:申请系统调度运行
            myThread.start();
        }
    
        //继承的方式:1.继承Thread,2.重写run方法(定义要执行的任务代码)
        private static class MyThread extends Thread{
            @Override
            public void run() {
                System.out.println("mythread run");
            }
        }
  • 使用匿名内部类创建Thread子类对象
        public static void main(String[] args) {
    
            //继承的写法2.使用一个匿名内部类
            Thread t = new Thread(){//属于继承Thread但没有名称的子类
                @Override
                public void run() {
                    System.out.println("匿名内部类 run");
                }
            };
            t.start();
        }

(2)实现Runnable

  • 实现Runnable接口
        public static void main(String[] args) {
            //实现Runnable写法1
            Thread t1 = new Thread(new MyRunnable());
            t1.start();
        }
         private static class MyRunnable implements Runnable{
            @Override
            public void run() {
                System.out.println("MyRunnable run");
            }
        }
  • 匿名内部类创建Runnable子类对象
            //实现Runnable写法2:匿名内部类
            Runnable r2 = new Runnable() {//属于Runnable接口的实现类(没有名字)
                @Override
                public void run() {
                    System.out.println("匿名内部类run");
                }
            };
            Thread t2 = new Thread(r2);
            t2.start();
    
            //也可以把匿名内部类对象,直接写在构造方法的参数上
            Thread t3 = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("匿名内部类run");
                }
            });
            t3.start();
    
  • 使用lambda表达式创建子类对象
        //了解:lambda表达式
        Thread t4 = new Thread(() -> System.out.println("匿名内部类run"));
        t4.start()

(3)实现Callable接口

二、Thread类及其常用方法

1、Thread常见的构造方法

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

2、启动线程

(1)start

thread.start();
//申请系统调度,执行thread中的任务(重写的run方法)

 main线程创建Thread的代码,没有执行重写的run方法。

 (2)start()和run()的区别

  • start:启动线程的方式;
  • run:属于线程任务的描述。

 (3)多个线程,同时存在并发和并行的现象

观察以下代码:

 main线程在执行到t.start()时,才会启动t线程,t线程的run中代码行和main线程的打印代码行执行顺序是随机的/无序的(但t线程启动后,系统调度才会执行run方法,这是过程是需要耗时的,所以先打印main的代码行)。

3、线程的属性

属性获取方法
IDgetId()
名称getName()
状态getState()
是否后台线程isDaemon()
是否存活isAlive()
是否被中断isInterrupted()
  • ID是线程的唯一标识,不同线程不会重复
  • 状态表示当前线程所处的情况
  • 关与后台线程:JVM会在一个进程的所有非后台线程结束后,才会结束运行

4、Thread常用方法

(1)等待一个线程--join()

方法说明
public void join()等待线程结束
public void join(long millis)等待线程结束,最多等 millis 毫秒
public void join(long millis, int nanos)同理,但可以更高精度

使用join后,两个并发并行的线程随即执行的方式,就变成了有序。

(2)获取当前线程引用

public static Thread CurrentThread();
//返回当前线程对象的引用

(3)休眠当前线程

让当前线程休眠(超时等待)给定时间(毫秒)。因为线程的调度是不可控的,这个方法只能保证实际休眠时间大于等于参数设置的休眠时间。

方法说明
public static void sleep(long millis) throws InterruptedException休眠当前线程 millis 毫秒

使用场景:进行程序的调试;控制多个线程的执行顺序。

(4)中断线程

方法说明
public void interrupt()中断对象关联的线程,如果线程正在阻塞,则以异常方式通知,否则设置中断标志位为true。
public static boolean interrupt()判断当前线程的中断标志位是否设置,调用后清除标志位(会重置中断标志位)
public static boolean isInterrupt()判断对象关联的线程标志位是否设置,调用后不清除标志位

【注】

  • Java中断,是以中断标志位的方式执行的;
  • interrupt是发起中断的动作,但线程是否中断,有代码是否判断中断标志位来决定;
  • 线程处于某些等待/超时等待的状态(会显式的抛InterruptException异常),都是允许被中断的,中断的方式是:(1)抛异常来进行中断(2)抛异常后,会重置中断标志位(默认false)

三、多线程(内存的使用)

Java进程的内存:栈、堆、方法区、程序计数器。

多线程Thread
程序猿教你打篮球的博客
04-17 7657
本期主要讲解: 1.Java 中如何进行多线程编程? 2.简单使用多线程 3.start和run的区别 4. jconsole 工具 5.Java中创建线程的写法 6.Thread方法介绍 6.1构造方法 6.2 Thread常见属性 6.3什么是守护线程? 6.5什么情况线程才是存活的? 6.6什么是线程中断?
C++11 多线程(std::thread)详解
jcShan709的博客
07-17 11万+
注:此教程以 Visual Studio 2019 Version 16.10.3 (MSVC 19.29.30038.1) 为标准 文章目录线程?进程?多线程?什么是多线程?进程与线程的区别C++11的std::threadstd::thread常用成员函数构造&析构函数常用成员函数举个栗子例一:thread的基本使用例二:thread执行有参数的函数例三:thread执行带有引用参数的函数注意事项(剩下的内容还没写完,明天再更) 线程?进程?多线程? 什么是多线程? 百度百科中的解释: 多.
多线程中继承Thread 和实现Runnable 接口的区别
qq_41664352的博客
08-08 6768
网上看了很多多线程里继承Thread 和实现Runnable 接口的区别,感觉不是很清晰,说下我的观点吧 区别一 创建线程的方式不同: 实现Runnable接口是代理模式,交给Thread()去start; 如:new Thread(new MyRunnable(),"线程名").start(); 一个继承Thread以后本身就是一个线程对象,可以直接start; 如:new MyThread().satrt(); 区别二 设置线程名方式不同 实现Runnable接口可以在创建线程时T
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
qq_35716689的博客
03-10 25万+
本文将介绍如何通过Java来实现一个多线程下载器。作者:牵着猫散步的鼠鼠
Python多线程编程(一):threading 模块 Thread 的用法详解
热门推荐
frank 的专栏
12-19 25万+
我们进行程序开发的时候,肯定避免不了要处理并发的情况。 一般并发的手段有采用多进程和多线程。 但线程比进程更轻量化,系统开销一般也更低,所以大家更倾向于用多线程的方式处理并发的情况。 Python 提供多线程编程的方式。 本文基于 Python3 讲解,Python 实现多线程编程需要借助于 threading 模块。 所以,我们要在代码中引用它。 import threading thread...
Java多线程基础-4:详解Thread及其基本用法
wyd_333的博客
04-03 5159
万字详解Java多线程编程Thread及其基本用法。
Linux 多线程原理深剖
qq_61500888的博客
12-24 4万+
带你一命通关 Linux 多线程原理 三十分钟手撕底层内涵
C++使用thread多线程编程
牧野的博客
12-28 7万+
C++11中引入了一个用于多线程操作的thread,简单多线程示例: #include #include #include using namespace std; void thread01() { for (int i = 0; i < 5; i++) { cout << "Thread 01 is working !" << endl; Sleep(100); }
QT 中的多线程之 moveToThread
火山上的企鹅
05-01 9463
​QThread 提供了一个与平台无关的管理线程的方法。一个 QThread 对象管理一个线程。QThread 的执行从 run() 函数的执行开始,在 Qt 自带的 QThread 中,run() 函数通过调用 exec() 函数来启动事件循环机制,并且在线程内部处理 Qt 的事件。在 Qt 中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能及时响应用户的请求操作。继承 QThread 下面通过具体的方法描述和例子来介绍第一种方法,第二种方法在下一篇文章中介绍。
多线程(一):创建线程线程的常用方法
人不风流枉少年
09-01 24万+
一:为什么要学多线程 应付面试 :多线程几乎是面试中必问的题,所以掌握一定的基础知识是必须的。 了解并发编程:实际工作中很少写多线程的代码,这部分代码一般都被人封装起来了,在业务中使用多线程的机会也不是很多(看具体项目),但是作为一个高级程序员如果不会多线程是说不过去的。 二:进程与线程 进程 进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统...
QT中利用TCP协议实现了一个多线程的文件互传系统
06-09
在QT框架下,利用TCP协议实现一个多线程的文件互传系统是一项常见的任务,它涉及到网络编程、多线程处理以及文件操作等多个方面。本文将深入探讨这些关键知识点。 首先,TCP(Transmission Control Protocol)是一...
Java多线程线程的创建与Thread的使用
未见花闻的博客
03-29 2704
本篇文章介绍java多线程Thread的使用以及有关线程对象创建和常用方法。
使用Thread创建和使用多线程
来杯奶茶
08-31 2468
Javayu'y的JVM允许程序运行多个线程,它通过java.lang.Thread来体现。 Thread的特性: 1)每个线程都是通过某个特定的Thrad对象的run()方法来完成操作的,经常把run()方法的主体称为线程体。 2)通过该Thread对象的start()方法来启动这个线程,而非直接调用run()。 继承于Thread创建多线程的步骤: 1)创建一个继承于Thread的子 2)重写Thread的run() —>将此线程执行的操作声明在run()中 3)创建Thr
No provider available from registry RegistryDirectory
最新发布
小道仙的后宫
10-20 398
最近在做配置文件升级,服务比较多,之前的Dubbo配置各个服务写的比较乱,有的用Nacos上的 data-id,有的又是在自己的服务引入配置遂准备统一了,全部都用Nacos上的配置,同时修改了Dubbo服务名发到线上的时候,线上崩了,部分服务出现如下错误注: IP和服务名做了隐藏处理。
【C++刷题】力扣-#121-买卖股票的最佳时机
会写代码的饭桶
10-16 650
给定一个数组 prices,其中 prices[i] 表示第 i 天的股票价格。假设你可以在第 i 天买入并在第 j 天卖出股票(i ≤ j),设计一个算法来计算你所能获取的最大利润。注意你只能持有一股股票,并且你不能同时参与多笔交易(即在再次买入前必须卖出股票)。
java 异常包装
fdvvg的博客
10-17 397
通过异常包装,可以在Java中有效地处理和传递异常。这样做不仅能保持原始异常的信息,还能为上层调用者提供更多的上下文信息。
基于SSM班级事务管理系统的设计
2401_87849773的博客
10-15 481
管理员账户功能包括:系统首页,个人中心,学生管理,班委管理,班会组织管理,健康档案管理,党员发展管理,党员培训管理,学生成绩管理。主要技术:Java,Spring,mybatis,mysql,jquery,html。班委账号功能包括:系统首页,学生管理,学生成绩管理,活动信息管理,班费通知管理。服务器:SpringBoot自带 apache tomcat。JDK版本:Java JDK1.8。数据库可视化工具: navicat。数据库版本: mysql5.7。开发系统:Windows。
JavaWeb合集05-SpringBoot基础知识
qq_57340195的博客
10-17 926
Autowrite :自动装配,通过声明的数据型来装配对应的bean对象。缺点,只能获取到一个相同型的bean对象,如果有IOC容器里面有2个Bean对象,使用@Autowrite依赖注入就好报错。由于三层架构中,每一层都需要下次成来提供对应的方法,所有要new 下一次的对象,如果上一层的名发送改变,那么上一层就需要修改对应的名,如下。3、@Resource注解:通过它来代替@Autowrite注解,直接指定要注入的Bean对象,参数name的值就是要注入的Bean对象。
Java 22 | 8】 深入解析Java 22 :Pattern Matching 特性详解
颜淡慕潇
10-17 6828
Java 22 进一步扩展了模式匹配(Pattern Matching)功能,简化了型检查和条件表达式的使用。此特性不仅提升了代码的可读性,还减少了常见的错误。以下是对 Java 22 中模式匹配的详细介绍,包括基础概念、增强特性、使用场景、示例代码,以及如何在实际项目中有效利用模式匹配
写文章

热门文章

  • Spring Boot框架 9470
  • 七大常用排序 7102
  • C语言实现通讯录 5921
  • c语言入门笔记 5574
  • 常见文件操作函数 4493

分类专栏

  • Python
  • RabbitMQ(消息队列)
  • Javaee进阶 3篇
  • javaee 13篇
  • 测试 1篇
  • javaWeb 6篇
  • 刷穿🗡☞ 2篇
  • 数据库 5篇
  • 数据结构 11篇
  • javase笔记 7篇
  • 小程序 1篇
  • C语言笔记 6篇

最新评论

  • c语言入门笔记

    不喜欢被代码敲的大秃噜: 太牛了,言简意赅

  • SpringBoot统一功能处理

    懒羊羊asd: 大佬互访一下呗表情包表情包表情包

  • Spring事务和事务传播机制

    懒羊羊asd: 大佬互访啊表情包表情包表情包

  • Spring事务和事务传播机制

    TimeFriends: 又学到了新知识->Spring事务和事务传播机制

  • Spring事务和事务传播机制

    赵四司机: 写的不错,条理很清晰,看着很容易理解

大家在看

  • 中英双语酒店管理系统——pms系统,海外版
  • 论文 Python 实现WOA-CNN-BiGRU-Attention数据分类预测 64
  • 手环押金原路退回系统——足浴店——东方仙盟

最新文章

  • Spring事务和事务传播机制
  • SpringBoot统一功能处理
  • MyBatis操作数据库
2022年51篇
2021年9篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢敲代码的大秃噜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家果洛商场美陈家用玻璃钢花盆销售厂家商场春季美陈介绍四会玻璃钢抽象雕塑批发稳定的玻璃钢卡通雕塑桃树玻璃钢雕塑山东常用商场美陈供应富阳区玻璃钢金属雕塑私人定做黑龙江定制玻璃钢雕塑市场商场美陈展示架浙江大型商场美陈销售公司河北超市商场美陈市场价迪斯尼玻璃钢雕塑原创作品武义卡通玻璃钢雕塑定制北京玻璃钢艺术雕塑报价表公园水景玻璃钢彩绘雕塑定做玻璃钢雕塑正确使用方法洛阳锻铜玻璃钢彩绘雕塑定做价格海南玻璃钢卡通雕塑公司玻璃钢雕塑价格生产厂家供应玻璃钢动物雕塑品牌广东玻璃钢海豚雕塑厂家华阴玻璃钢仿铜雕塑大同小品系列玻璃钢雕塑安装玻璃钢雕塑猎豹图片天水玻璃钢卡通雕塑定制台湾玻璃钢仿真水果雕塑价格武汉玻璃钢雕塑报价多少山东装饰商场美陈哪家好江宁元旦商场美陈香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化