认识一下线程
创始人
2025-05-28 15:47:03
0

                              1.线程的定义

                      2.线程和进程的区别和应用

             3.多线程的五种代码实现方式

                                    1.使用继承Thread类,重写run方法实现

                            2.使用实现Runnable接口,重写run方法

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

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

      5.使用lambda表达式

          4.查看线程的方法

     5.Thread类的常见方法

 6.Thread类常见的几个属性

1.什么是线程

线程是独立的执行流,进程包含线程,多个线程在进程中也是并发执行的,多个线程在CPU上调度执行的顺序是随机的

在Java中我们会采用多线程编程,为啥不采用多进程编程呢

操作系统提供了多进程的API,但是JDK并没有对这些API进行进一步封装,所以Java无法使用

,那么就采用多线程编程

线程和进程相比更加轻量,创建线程耗费的资源也更少

一个进程的多个线程之间共用同一份资源

1.内存资源

2.文件描述符表

只有在进程启动,创建第一个线程的时候,需要申请系统资源,之后的线程就不用了,进程之间互不影响,但是线程之间一旦有一个崩溃了,那么就可能导致其他线程也崩溃,导致整个进程崩溃

这个可能比较抽象,我来举个例子

比如CCtalk,我们点击运行,它是一个进程,里面的声音,画面等功能就是多线程,假如画面卡顿了,就有可能导致声音卡顿,甚至导致整个程序崩溃

来解释一下多个线程是并发执行的原因

这里的并发说的也是并发+并行

可以在多个CPU的多个核心同时执行

可以在一个CPU的一个核心上,进行快速调度运行

可以在一个CPU的多个核心上同时进行

其实操作系统调度的是线程,我们所说的进程调度是因为之前讨论的是进程只有一个线程的情况

说了这么多,我们来总结一下的进程和线程的区别

1.进程包含线程

2.进程有独立的内存资源和文件描述符表,同一个进程的多个线程之间,共享同一份内存地址和文件描述符表     

3.进程是操作系统资源分配的基本单位,线程是操作系统进程调度的基本单位

4.进程之间具有独立性,线程不具有独立性

5.创建线程比创建进程快

6.销毁线程比销毁进程快

7调度线程比调度进程快

下面来说一说线程的代码表现

线程其实是操作系统的概念,Java进一步对线程API进行封装,Java有个Thread类就是表示线程的,下面让我们用代码来看看

1.继承Thread类,重写run方法实现

package threading;//继承Thread类,重写run方法
class MyThread extends Thread{@Overridepublic void run() {System.out.println("hello t ");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}
public class ThreadDemo1 {public static void main(String[] args)  {Thread t = new MyThread();//向上转型//创建一个新的线程t.start();t.run();//注意,这个方法代表还是主线程里面的while (true) {System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

2.继承runnable接口,重写run方法

class MyRunnable implements  Runnable{@Overridepublic void run() {while(true){System.out.println("hello t");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}public class ThreadDemo2 {public static void main(String[] args) {MyRunnable runnable=new MyRunnable();Thread t=new Thread(runnable);t.start();while(true){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

3.继承Thread类,实现匿名内部类

public class ThreadDemo3 {public static void main(String[] args)  {Thread  t=new Thread(){@Overridepublic void run() {while(true){System.out.println("hello t");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}};t.start();while(true){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

4.继承runnable 接口,实现匿名内部类

public class ThreadDemo4 {public static void main(String[] args) {Thread t=new Thread(new Runnable() {@Overridepublic void run() {while(true){System.out.println("hello t");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}});t.start();while(true){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

5.使用lambda表达式

public class ThreadDemo5 {public static void main(String[] args) {Thread t=new Thread(()->{while(true){System.out.println("hello t");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();while(true){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

我们有时候需要查看线程的状态,这时需要使用idea下的一个工具,方法如下

1.运行线程

2.打开Java所在文件目录,找到bin目录下的jconsole.exe,点击运行

C:\Program Files\Java\jdk1.8.0_192\bin,在我的电脑是这个路径,每个人的应该是不一样的

线程在跑的时候,就可以通过这个工具看到

Thread常见的方法

Thread()//创建线程对象

Thread(Runnable target)//继承runnable接口,创建线程对象

Thread(String name)//给线程起个名字,方便调试

Thread(Runnable target ,String name)//使用 Runnable 对象创建线程对象,并命名

起名字这个只是起个名字,开举个例子

再次打开JDK下的jconsle查看

 

就是为了方便调试而已

Thread类的一些属性,线程有自己的状态,优先级,上下文,记账信息,id等,其实进程 的属性就是线程的,只是我们那个时候讨论的是只有一个线程的进程

 ID                        getId()

名称                    getName()

状态                   getState()

优先级                getPriority()

是否后台线程     isDaemon()

是否存活             isAlive()

是否被中断             isInterrupted()

这一期就先聊前六个,中断放到下一期,这个比较复杂

先看id,每个线程都有自己的'id',这算自己的身份标识

name就是每个线程的名字了

状态,举个例子

现在的代码是runnable状态,也就是正在运行

对于优先级和状态后后期进行详细讲解

看看isDaemon()方法,结果默认是false,那就是后台线程,如果改为true,那就是前台线程.

上代码

public class ThreadDemo8 {public static void main(String[] args) {Thread t=new Thread(()->{while(true){}});t.start();//此时默认是前台线程,阻止线程结束}
}

一直在跑,但是没有结束

public class ThreadDemo8 {public static void main(String[] args) {Thread t=new Thread(()->{while(true){}});t.setDaemon(true);//将值改为true,变为后台进程,不阻止线程结束t.start();//此时默认创建的线程是前台线程,阻止线程结束}
}

t.isAlive()方法,结果是啥取决于线程的入口方法是否执行结束,如果执行执行结束,结果就为false,否则为true

说了这么多,来总结一下吧

1.前台线程会阻止Java进程 的结束,Java进程中所有的前台线程结束以后进程才能结束

2.后台进程不会阻止Java进程的结束,不管后台进程结没结束,只要所有前台进程结束,进程就结束

3.线程对应的入口方法执行完,这个时候线程就不存在了 

今天的分享就到这里,下期再见

相关内容

热门资讯

容芯致远获天使轮融资 2026年5月8日,北京容芯致远科技有限公司(简称“容芯致远”)宣布完成天使轮融资。本轮融资由万利达...
试管期间能运动吗?避开这些坑,... 做试管的姐妹都纠结:不动怕气血差、影响卵泡,动了又怕伤子宫、毁着床,到底该怎么办?其实试管不用“躺平...
原创 今... 2026年5月6日,国内金价算是彻底“凉”了一下,你看那AU9999现货黄金,直接跌到了1013元一...
美国5月消费者信心再创历史新低... 财联社5月8日讯(编辑 牛占林)随着中东战争持续推高能源价格,美国消费者信心本月继续下滑,并再度刷新...
“压高盛一头”!江西一精神病院... 蓝鲸新闻5月8日讯(记者 徐甘甘)5月8日,盛通股份(002599.SZ)一季报引发资本市场热议——...
2026年企业短视频能力升级:... 本篇将回答的核心问题 2026年企业短视频营销面临哪些关键挑战,有效应对策略是什么? 服务机构的能力...
江西一精神病院炒股炒成上市公司... 红星资本局5月8日消息,近日,上市公司盛通股份(002599.SZ)发布一季报,披露了前十大股东名单...
企业IP打造指南:小公司低成本... 小公司做企业IP,不是为了装门面,而是让客户在没见到你之前,就能通过内容知道你是谁、你解决什么问题、...
官方:赵心童入选世界斯诺克名人... 北京时间5月8日消息,世界斯诺克巡回赛(WST)今日正式公布了2025/26赛季年终奖项及名人堂更新...
小灰熊AI学员王锋:希望能跟上... 35了,老程序员了。 从进入互联网行业到现在,其实已经做了很多年移动端开发。最早那几年,安卓行业发展...
原创 2... 2026年全国两会把稳定房地产市场列为重点工作,政府工作报告明确提出因城施策控增量、去库存、优供给。...
一年翻倍,六年未归——徽商银行... 文:向善财经 今年的港股市场,与A股市场出现了明显的分化。 A股这边,科技板块在AI浪潮中热闹非凡;...
古井贡酒2025:在行业深度调... 以“稳”为底、以“新”为翼。 文/每日财报 杜康 在行业库存高企、价格倒挂的背景下,当多数酒企在为...
好上好8408万收购鼎瑞芯加码... 5月7日晚,好上好(001298.SZ)抛出一份收购公告,拟以8408万元现金收购深圳市鼎瑞芯科技有...
全面大撤离!李嘉诚英国“套现”... 突发,李嘉诚又卖了。 这次,套现了455亿。 金额不少,但更值得关注的是透露着不同寻常的信号。 因为...
油气价格上涨加剧法国一季度贸易... 据新华社,法国海关7日发布的数据显示,受中东局势推高国际油气价格影响,法国今年第一季度贸易逆差扩大至...
昆仑芯启动科创板IPO上市辅导... 5月8日,据证监会官网显示,昆仑芯(北京)科技股份有限公司于2026年5月7日正式启动科创板上市辅导...
贵州茅台酒股份有限公司关于回购... 来源:上海证券报 证券代码:600519 证券简称:贵州茅台 公告编号:临2026-016 贵州茅...
百度昆仑芯启动科创板上市辅导,... 5月8日,证监会官网显示,昆仑芯(北京)科技股份有限公司 (下称“昆仑芯”)于2026年5月7日正式...
滕州信华的承压时刻:罚单、失信... 2026年4月末,滕州信华美元债单日跌近2%,关联方被列“老赖”。半年前,这家AA+城投曾因非市场化...