多线程简介

AWT与线程 NULL 博文链接:https://luxiaofeng2006.iteye.com/blog/792718 立即下载

线程是比进程更小的单位,一个进程可以由很多的线程组成。每个进程都有一段专用的内存区域,而线程间可以共享相同的内存区域(包括代码和数据),并利用这些共享单元来实现数据交换、实时通信和必要的同步操作。

每个java程序都有一个默认的主线程。每个main方法可以启动一个线程,这个线程叫做“主线程”,然后可以通过“主线程”创建新的线程。正常的线程在创建后如果没有外部原因,生命周期不再受创建它的线程关联,也就是说main线程结束不会影响到新建线程的执行。当然守护线程是不同的,它同创建它的线程的声明周期息息相关。

java虚拟机允许应用程序并发地运行多个执行线程。

优先级

每个线程都有优先级,高优先级线程的执行优先于低优先级线程。默认的优先级为5.在处理优先级时要注意,较低优先级的线程很有可能会造成活锁。

一个完整的线程有一下几种状态:新建、运行、(中断/挂起/阻塞)、消亡。

 1、新建:
  当一个Thread类或其子类对象被声明并创建,新生的线程对象就处于新建状态(此时它已经有了内存空间和其他资源)。
 2、运行:
  线程已经创建就具备了运行的条件,一旦轮到它来享用CPU资源时,即JVM将CPU使用权切换给该线程时,此线程就可以脱离创建它的主线程独立开始自己的生命周期了。
  线程创建后仅仅是占有了内存资源,在JVM管理的线程中还没有这个线程,此线程必须调用start()方法(从父类继承)通知JVM,这样JVM就知道又有一个新的线程排队等候切换。

  当JVM将CPU使用权切换给线程时,如果线程是Thread的子类创建的,该类中的run()方法立刻执行(run()方法中规定了该线程的具体使命)。Thread类中的run()方法没有具体内容,程序要在Thread类的子类中重写run()方法覆盖父类该方法。(注意:在线程没有结束run()方法前,不要再调用start方法,否则将发生ILLegalThreadStateException异常)
 3、挂起:
  线程挂起的原因有一下四种:
  (1) JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权,并处于挂起状态。
  (2) 线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状态。sleep(int millsecond)方法是Thread类中的一个类方法,线程执行该方法就立刻让出CPU使用权,进入挂起状态。经过参数millsecond指定的毫秒数之后,该线程就重新进到线程队列中排队等待CPU资源,然后从中断处继续运行。
  (3) 线程使用CPU资源期间,执行了wait()方法,使得当前线程进入等待状态。等待状态的线程不会主动进入线程队列等待CPU资源,必须由其他线程调用notify()方法通知它,才能让该线程从新进入到线程队列中排队等待CPU资源,以便从中断处继续运行。
  (4) 线程使用CPU资源期间,执行某个操作进入阻塞状态,如执行读/写操作引起阻塞。进入阻塞状态时线程不能进入线程队列,只有引起阻塞的原因消除时,线程才能进入到线程队列排队等待CPU资源,以便从中断处继续运行。
 4、死亡:
  死亡状态就是线程释放了实体,即释放了分配给线程对象的内存。线程死亡的原因有两个:
  (1) 正常运行的线程完成了它的全部工作,即执行完run()方法中的全部语句,结束了run()方法。
 (2) 线程被提前强制性终止,即强制run()方法结束。

实现方式

java有2中实现方式。一种是继承Thread,另外一种是实现Runnable接口。

个人比较倡议尽量使用Runnable接口来实现多线程。首先java不支持同时继承多个类,一旦我们继承了Thread类后,可能导致其他需要的类无法继承实现;其次Runnable接口实现的多个线程可以使用同一个实例,这样线程间可以共享一些内存单元(变量,方法),当然用Thread实现的多线程间可以是可以通过类变量或类方法来实现这种共享的,但是类变量的实现方式在变量的共享范围和生存周期上不太好控制。


线程的常用方法

  • start():线程调用该方法将启动线程,从新建态进入就绪队列,一旦享用CPU资源就可以脱离创建它的线程,独立开始自己的生命周期。
  •  run():Thread类的run()方法与Runnable接口中的run()方法功能和作用相同,都用来定义线程对象被调度后所进行的操作,都是系统自动调用而用户不得引用的方法。run()方法执行完毕,线程就成死亡状态,即线程释放了分配给它的内存(死亡态线程不能再调用start()方法)。在线程没有结束run()方法前,不能让线程再调用start()方法,否则将发生IllegalThreadStateException异常。
  •  sleep(int millsecond):有时,优先级高的线程需要优先级低的线程做一些工作来配合它,此时为让优先级高的线程让出CPU资源,使得优先级低的线程有机会运行,可以使用sleep(int millsecond)方法。线程在休眠时被打断,JVM就抛出InterruptedException异常。因此,必须在try-catch语句块中调用sleep方法。
  •  isAlive():当线程调用start()方法并占有CPU资源后该线程的run()方法开始运行,在run()方法没有结束之前调用isAlive()返回true,当线程处于新建态或死亡态时调用isAlive()返回false。
     注意:一个已经运行的线程在没有进入死亡态时,不要再给它分配实体,由于线程只能引用最后分配的实体,先前的实体就成为了"垃圾",并且不能被垃圾回收机制收集。
  •  currentThread():是Thread类的类方法,可以用类名调用,返回当前正在使用CPU资源的线程。
  •  interrupt():当线程调用sleep()方法处于休眠状态,一个占有CPU资源的线程可以让休眠的线程调用interrupt()方法"吵醒"自己,即导致线程发生IllegalThreadStateException异常,从而结束休眠,重新排队等待CPU资源。
  • join():等待该线程结束。 一个线程A在占有CPU资源期间,可以让其他线程调用join()方法和本线程联合,如:
      B.join();
     此时称A在运行期间联合了B。这时A线程立刻终端执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源。但如果A准备联合的线程B已经结束,则B.join()不会产生任何效果。

特殊线程

GUI线程

JVM在运行包含图形界面应用程序时,会自动启动更多线程,其中有两个重要的线程:AWT-EventQueue和AWT-Windows。AWT-EventQueue线程负责处理GUI事件,AWT-Windows线程负责将窗体或组件绘制到桌面。

守护线程

守护线程是当程序中所有用户线程都已结束运行时即使守护线程的run()方法还有需要执行的语句,守护线程也会立刻结束运行。因此守护线程用于做一些不是很严格的工作,当线程随时结束时不会产生什么不良后果。

基于STM32、HAL库的GZP6816D气压传感器 驱动程序设计 测量范围:0-16kPa(可根据型号不同有变化)工作电压:1.8V-3.6V。高精度:±1% FS。 阅读详情

相关推荐

C# 进程间 双内存共享 高帧率图像传输

演示了两个进程之间通过 双内存共享 的方式, 来实时处理图像,并以高帧率(40~60FPS)传输的基本示例。 进程间内存共享的优点:高性能、低延迟、资源效率高、简单可靠。 适用场景:实时图像处理、大数据传输、多进程协作、实时监控系统,等等。

qianqiansd 1996

Java多线程

先简单阐述一下多进程,本部分内容可以在大学计算机基础和计算机概论等相关课程当中了解到,这里不做过多的展开,主要讲讲多线程相对于多进程的区别和优势 多进程的概念 当前使用的操作系统都是多任务的OS,每个独立执行的任务就可以叫做一个进程(比如说你开了两个QQ那就是两个进程)(具体内容可以见操作系统的相关书籍) 操作系统会讲时间划分为一个个非常短的时间片,每个时间片内将CPU分配给某一个任务,时间片结束,CPU将自动回收,再分配给另外任务。(由于时间非常的短,所以你是没有办法感受到的) 当然多进程有很多优点 同

Garyboyboy的博客 316

Python爬虫实战:巧用HEAD请求和Cookie令牌绕过沃尔玛反爬(附完整代码)

本文详细介绍了如何利用Python爬虫技术,通过HEAD请求和Cookie令牌绕过沃尔玛的反爬机制。文章深入解析了人机验证系统的运作原理,并提供了完整的工程化实现代码,包括令牌池设计、高并发架构和异常处理策略,帮助开发者高效采集电商数据。

weixin_29046035的博客 1009

程序员简历这么写,offer收到手软。

程序员就业竞争大?找不到工作?也许,从简历开始你就被淘汰了… 在大多数公司中,HR的招聘压力很大,受时间的挤压,或许浏览每个人简历的时间只有10几秒,也许你的工作能力很强,但如果没有在简历上有效地展示出,也很难进入理想的公司。 一份好的简历,不仅能够打动HR,获得面试机会,甚至可以引导面试官的提问,从而在面试中立于不败之地。 那么,一份好的程序员简历,应该怎么写呢? 细节决定成败 排版 程序员的简历排版一直只有一个要求,那就是简洁清晰,不要各种五彩斑斓,花里胡哨,一般面试官会更重视你的内容而不是排版。 简

技术专家 605

以LAN8720A为例的以太网硬件设计方案

输入时钟(XTAL1/CLKIN,XTAL2):推荐外加25MHz(性价比较高)晶振为PHY芯片提供时钟,PHY芯片内部PLL将其倍频为50MHz来使用,亦可使用直接使用50MHz晶振。三位MODE通过高低电平组合分别对应以上8种模式 ,包含10M半双工,10M全双工,100M半双工,100M全双工,是否启用自协商协议,CRS是否有效等。VDDCR:1.2V电源,可由芯片内部稳压电源提供,亦可由外部电源提供,由外部电源提供可降低芯片功耗。REF_CLK:参考时钟,由MAC或外部时钟晶振向PHY芯片提供。

weixin_46154042的博客 5885

SLG大地图实战:从Tilemap到Shader的地表渲染与数据分层架构

本文深入探讨了SLG大地图开发中的关键技术挑战与解决方案,包括Tilemap系统的深度改造、地表渲染的Shader优化以及数据分层架构设计。通过实战案例,展示了如何实现视觉表现丰富、性能开销可控的SLG大地图,特别适合Unity开发者和游戏技术美术参考。

weixin_28693309的博客 520

阿里面试官必问:对多线程熟悉吗,来谈谈线程池的好处?

线程的创建和销毁的开销是巨大的,而通过线程池的重用大大减少了这些不必要的开销,当然既然少了这么多消费内存的开销,其线程执行速度也是突飞猛进的提升。并发:在某个时间段内,多个程序都处在执行和执行完毕之间;但在一个时间点上只有一个程序在运行。头脑风暴:老鹰妈妈喂小雏鹰食物,小雏鹰很多,而老鹰只有一张嘴,她需要一个个喂过去,到最后每个小雏鹰都可以吃到,但是在一个时间点里只能有一个小雏鹰可以吃到美味的食物。并行:在某个时间段里,每个程序按照自己独立异步的速度执行,程序之间互不干扰。

Java后端架构V 184

【清风数学建模笔记】第十一讲:时间序列分析

【清风数学建模笔记】第十一讲:时间序列分析

manerzi的博客 833

快速了解和熟知多线程

例如,播放电影时,就必须由一个线程播放视频,另一个线程播放音频,两个线程需要协调运行,否则画面和声音就不同步。进程和线程是包含关系,但是多任务既可以由多进程实现,也可以由单进程内的多线程实现,还可以混合多进程+多线程。​ 多进程稳定性比多线程高,因为在多进程的情况下,一个进程崩溃不会影响其他进程,而在多线程的情况下,任何一个线程崩溃 会直接导致整个进程崩溃。Fork/Join任务的原理:判断一个任务是否足够小,如果是,直接计算,否则,就分拆成几个小任务分别计算。我们提交的任务只需要实现。

qq_63711065的博客 294

矢量网络分析仪校准:原理、方法与系统适配性

矢量网络分析仪(VNA)校准是射频测量的关键环节,通过误差建模(12项误差项)和标准件测量,可将系统不确定度从±5dB降至±0.1dB以下。主流校准方法包括SOLT(适用于同轴系统)和TRL(适用于波导系统),二者在标准件、误差重点及频率上限等方面存在显著差异。随着6G与量子通信的发展,动态实时校准将成为新趋势。工程师需根据传输结构、频率范围及精度需求选择合适方法,确保测量精度。

u014344410的博客 262

Android实战——白天黑夜模式设置

白天黑夜模式是一种动态的UI模式,根据当前时间或用户设置的偏好,在白天和黑夜之间进行切换。它通过调整应用程序的颜色、亮度和其他可视化元素来提供更加舒适和易读的用户界面。

小旭的专栏 5229

java 线程(多线程)thread,案例:汉字打字练习(AWT-EventQuecue,AWT-Windows)

实验目的 当Java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue和 AWT-Windows。AWT-EventQuecue线程负责处理GUI事件。AWT-Windows线程负责将窗体或组件绘制到桌面。JVM要保证各个线程都有使用CPU资源的机会,例如,程序中发生GUI界面事件时,JVM就会将CPU资源切换给AWT-EventQuecue线程,AWT-EventQuecue线程就会来处理这个事件,例如,你单击了程序中

weixin_45762499的博客 3277

【Claude】Auto mode cannot determine the safety of an action 报错已解决

Claude Code Auto mode 安全分类器报错完整解析,涵盖 temporarily unavailable、could not evaluate、transcript exceeded 三种情况的根因与处理

博客 1万+

多线程编程简介

线程是进程中的一个单一顺序的控制流。一个进程可以包含多个线程,每个线程并行执行不同的任务。多线程是多任务的一种特别形式,但相比于多进程,多线程使用更小的资源开销。线程池是一种有效的多线程编程方式,可以提高程序的性能。使用模块,你可以轻松地创建和管理线程池。无论你选择哪种方式,多线程编程都可以帮助你更好地提高程序的效率。

浪里个狼游记 1270

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Python多线程简介

Python多线程简介 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了解线程池的使用 线程基本概念 1.1 线程是什么? 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1) 地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; (2) 资源拥有:进程是资源分配和拥有的单位,同一个进...

qq_43590221的博客 953

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

多线程的简介

线程(Thread):线程是进程中的实际运作的单位,是进程的一条流水线,是程序的实际执行者,是最小的执行单位。注意:很多多线程都是模拟出来的,真正的多线程是指有多个CPU,即多核,如服务器,如果是模拟出来的多线程,即一个CPU的情况下,在同一个时间点,CPU只能执行一个代码,因为切换的很快,所以就有同时执行的错觉。引起阻塞的原因有很多,比如:等待I/O操作、被更高的优先级的进程剥夺了CPU权限等。即一个CPU的情况下,在同一个时间点,CPU只能执行一个代码,因为切换的很快,所以就有同时执行的错觉)。

ws44669的博客 183

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java多线程简介

多线程在Java中无处不在,在上一篇(Java线程概念理解)中我们看到就算是一个最简单的Java类中也涉及到了多个线程,大家可能会疑惑,为什么一个这么简单的Java类中,却启动了那么多“无关”的线程,Java是不是将简单的问题搞复杂了呢?答案当然是否定了,这是因为正确的使用多线程能够将耗时的处理大大的缩减时间,能够让用户的体验更加友好。使用多线程的主要原因有以下几点: 更多的处理器核心 现代...

zhangzw的博客 276

JAVA多线程简介

一、简介 1.线程 线程是程序执行的一条路径,一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率,可以同时完成多项工作 2.应用场景 红蜘蛛同时共享屏幕给多个电脑 迅雷开启多条线程一起下载 QQ同时和多个人一起视频 服务器同时处理多个客户端请求 3.并行和并发的区别 并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU) 并发是指两个任务都...

qq_40298054的博客 397

C语言中的多线程简介

线程 Thread 专业术语称之为程序执行流的最小单元。线程是不会执行程序的,可以理解成线程就是一个载体,将 要执行的代码 运送到CPU进行处理。 多线程就是多个线程同时并发执行。 (注意并发与并行的区别,并行同时执行不同的任务,并行是交替执行不同的任务。) 1,为什么要用多线程? 1)避免阻塞 单个线程中的程序,是按照顺序执行的,排在前面的程序如果发生异常卡住(阻塞),会影响到后面......

Hemingway_Hoo的博客 1万+
上一篇: Queue
下一篇: JAVA线程池
weeweee
博客等级 码龄16年 10粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值