24.线程常用方法

JavaSE笔记(六)多线程 Java多线程 **注意:**本章节会涉及到 操作系统 相关知识。 在了解多线程之前,让我们回顾一下操作系统中提到的进程概念: 进程是程序执行的实体,每一个进程都是一个应用程序(比如我们运行QQ、浏览器、LOL、网易云音乐等软件),都有自己的内存空间,CPU一个核心同时只能处理一件事情,当出现多个进程需要同时运行时,CPU一般通过时间片轮转调度算法,来实现多个进程的同时运行。 在早期的计算机中,进程是拥有资源和独立运行的最小单位,也是程序执行的最小单位。但是,如果我希望两个任务同时进行,就必须运行两个进 阅读详情

1.休眠

Thread.sleep(3000);//线程休眠3秒

使得当前正在执行的线程休眠一段时间,释放时间片,导致线程进入阻塞状态
sleep(3000),3000的单位是毫秒,设置了sleep就相当于将当前线程挂起5s,这个操作跟线程的优先级无关,当对应的时间到了之后,还会再继续执行


2.合并线程

public class Demo3 {

	public static void main(String[] args) {
		for(int i=0; i<100; i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
			//当i=20 合并线程
			if(i==20){
				//创建合并过来的线程
				CustomThread t=new CustomThread("合并的线程");
				t.start();
				
				try {
					//合并线程
					t.join();
					//合并过来的线程,执行结束后,主线程才会继续执行
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

在执行原来线程的过程中,如果遇到了合并线程,则优先执行合并进来的线程,执行完合并进来的线程后,再回到原来的任务中,继续执行原来的线程

特点:

  • 1)线程合并,当前线程一定会释放cpu时间片,cpu会将时间片分给要Join的线程
  • 2)哪个线程需要合并就在当前线程中,添加要合并的线程
  • 3)join之前,一定要将线程处于准备状态start

3.设置线程优先级

可以通过设置优先级来改变线程抢到时间片的概率,优先级高的线程获得较多的执行机会

1)默认情况下,每个线程的优先级都与创建它的父线程具有相同的优先级,例如:main线程具有普通优先级,则由main线程创建的子线程也有相同的普通优先级
2)所传的参数范围1~10,默认为5,对应的数值越大,说明优先级越高,这个方法的设置一定要在start之前
线程的优先级低并不意味着争抢不到时间片,只是抢到时间片的概率比较低而已


4.后台线程


public class Demo4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//后台线程
		DaemonThread dt=new DaemonThread();
		//设置为后台线程
		dt.setDaemon(true);
		//一定在start之前设置
		dt.start();
		//主线程任务
		for(int i=0; i<100; i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}

隐藏起来一直在默默运行的线程,直到进程结束,又被称为守护线程或精灵线程,JVM的垃圾回收线程就是典型的后台线程

特征:如果所有的前台线程都死亡,后台线程会自动死亡,必须要在start之前执行


5.线程让步

public class YieldThread extends Thread {
	public YieldThread(){
		
	}
	public YieldThread(String name){
		super(name);
	}
	public void run(){
		for(int i=0; i<50; i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
			//当i=20时 线程让步
			if(i==20){
				System.out.println(Thread.currentThread().getName()+"开始让步");
				Thread.yield();
			}
		}
	}
}

主类:


public class Demo5 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//线程让步
		YieldThread t0=new YieldThread("线程0");
		t0.start();
		YieldThread t1=new YieldThread("线程1");
		t1.start();
	}
}

  • 可以让当前正在执行的线程暂停,但它不会阻塞该线程,他只是将该线程转入就绪状态,完全可能出现的情况是:当某个线程调用了yield方法暂停之后,线程调度器又将其调度出来重新执行

  • 实际上,当某个线程调用了yield方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的就绪状态的线程才会获得执行的机会


处于Running状态的线程,如何进入到阻塞Blocked状态?
1、sleep(睡眠时间,毫秒为单位) 睡眠时间结束后,自动进入到Runnable可运行状态
2、join() 当前线程停止,执行合并过来的线程,当合并过来的线程执行结束后,继续执行之前的线程

多线程的常用操作方法 目录一、线程命名与取得二、线程休眠Thread.sleep()----单位(ms)三、线程让步Thread.yield()四、线程插队join()4.1案例14.2案例24.3案例3五、sleep和yield的区别六、线程停止6.1手工设置标记位6.2使用stop( )方法6.2.1对线程不安全的解释:6.3使用Thread类提供的interrupt( )中断线程6.3.1案例16.3.2案例2七、线程调度1.调度策略2.线程优先级 一、线程命名与取得 多线程的运行状态是不确定的,所以对于多线程操作必须有一 阅读详情

相关推荐

《Java SE实战指南》24-04:Thread类常用方法

更新中

西安极客联盟 476

线程的控制

线程的控制 sleep(Long millis):使当前线程进入睡眠状态(是一个静态方法) join() / join(Long millis):是当前线程进入阻塞状态(是一个实例方法) interrupt():中断阻塞状态的线程 isAlive():判断当前线程是否处于存活状态 yield():线程让步

m0_54397364的博客 390

【电子元件篇】MOSFET场效应管作用、选型和测量指南-超简单解读

场效应管是一种电压控制型半导体器件,相比三极管具有输入阻抗高、噪声小、功耗低等优势。主要分为结型和绝缘栅型两大类,后者又可分为耗尽型和增强型MOS管。场效应管通过栅极电压控制漏极电流,具有转移特性和输出特性两大静态特性,以及快速的开关特性。其关键参数包括饱和漏源电流、夹断电压、跨导等,应用场景涵盖信号放大、恒流源、阻抗变换等领域。使用时需根据电路需求选择合适类型,如结型管适合一般放大,功率MOSFET适合高压大电流场合。检测时可用万用表电阻档初步判断好坏和放大能力。

2301_81299416的博客 2540

Thread 类的基本用法

线程创建、线程中断、线程等待、线程休眠、获取线程实例

tl2267190799的博客 937

深入浅出DDR系列(二)--DDR工作原理

学习完了DDR的基本组成和硬件结构原理之后,从整体上了解了DDR的特性和静态图,包括原理、管脚图等。那么本章就要从动态的角度来分析时序结构,包括read/write的整个过程到数据返回发生了什么,其中包括以下内容 DDR是如何完成Read、Write 等的操作 DDR的基本命令 DDR的时序参数 DDR的性能分析 1. DRAM基本组成 对于DRAM,其主要由行和列组成,每一个bit中都是由类似右下图的类晶体管的结构组成,对于sdram的数据,可以通过控制column和row就可以访问sd

奇小葩 3万+

DASH 流媒体协议(Dynamic Adaptive Streaming over HTTP)概述——起源、MPD文件解析、相关项目

简单介绍DASH的起源与发展、MPD文件简要解析、相关项目,以及常见流媒体协议的比较

farewellyi的博客 6880

java中sleep()方法的解析

java中sleep()方法的解析 Thread.sleep(3000);就是指让当前正在运行的占用cpu时间片的线程挂起3000ms,把cpu的时间片交给其他线程,但是并没有指定把CPU的时间片接下来到底交给哪个线程,而是让这些线程自己去竞争(一般操作系统会根据优先级调度)所以说让当线程睡眠,是帮助所有线程获得运行时间的最佳方法需要的注意的是就算...

Y先森0.0 1752

C++ 工程实践(9):数据抽象

陈硕 (giantchen_AT_gmail)http://blog.csdn.net/Solstice  http://weibo.com/giantchen陈硕关于 C++ 工程实践的系列文章: http://blog.csdn.net/Solstice/category/8

陈硕的Blog 1万+

Thread线程类基本使用(下)

前一篇文章主要介绍了如何创建新线程和如何查看Java进程中的线程信息等知识,这篇文章接着介绍关于Thread的一些构造方法及方法,这篇文章会用到。

qq_61797201的博客 1653

PX4飞控 vs 大疆A3:开源与闭源方案在无人机硬件架构中的实战对比

本文深入对比了PX4飞控与大疆A3在无人机硬件架构上的差异,分析了开源与闭源方案在工业级无人机开发中的优劣势。通过详细的硬件配置、传感器兼容性、扩展能力及性能测试数据,为开发者提供选型指南,特别适合需要自定义算法和复杂功能集成的项目。

a3b4c5的博客 886

阿里系acw_sc__v3滑块验证码逆向分析与实战破解

本文深入解析阿里系acw_sc__v3滑块验证码的核心机制与逆向破解方法。通过分析加密参数生成、轨迹验证模块和动态加密策略,提供完整的自动化破解方案,包括设备指纹生成、缺口识别和轨迹加密等关键技术。文章还分享了常见问题的调试技巧,帮助开发者应对阿里系验证码的复杂防护体系。

wdx012345的博客 1827

24、多线程、线程中常用的方法、多线程中生产者与消费者、线程第三种创建方式、枚举、线程池、单例设计模式、定时器

一、线程的常用方法 二、Object提供的操作线程的方法 三、多线程生产者与消费者 四、多线程的第三种创建方式 五、枚举 1.简介 1.枚举就是用于表示一些固定的值(常量) 可以用枚举来表示,枚举项是对象 2.定义枚举类: 访问修饰符 enum 枚举类的名称(){ 枚举项 } 3.特点: 每个枚举类都是Enum的子类 每个枚举项都是一个对象 枚举中可以定义成员变量 枚举类只能有私有的构造方法,默认的就是私有的构造 枚举类中可以有抽象的方法,但是每一个枚举...

故园风雨前的博客 129

使用 Python 和蒙特卡罗计算未来股价走势以及历史波动率和隐含波动率

蒙特卡罗模拟等工具使投资者能够洞察一系列潜在的未来。这远离了单纯的猜测,迈向了明智的、数据驱动的决策。

探索人工智能领域 706

常用的面试题

Java 24种设计模式 TCP和UDP编程 IO流常用的类和方法使用 线程的使用和网络编程的结合 异常的使用方法对比 反射的方法使用 数据库 Select DML DDL TCL DCL PL/SQL ...

weixin_42288943的博客 78

《FPGA接口与协议》专栏的说明与导航

《FPGA接口与协议》专栏的说明与导航(建议阅读)。

孤独的单刀 17万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JDK 24里程碑:虚拟线程重大升级,要用虚拟线程请务必用JDK24

摘要 本文解析了JDK 24对虚拟线程(Virtual Threads)的重大升级,重点解决了与synchronized关键字相关的线程固定(Pinning)问题。通过JEP 491提案,JDK 24重构了synchronized的底层实现,使虚拟线程能够在不绑定平台线程的情况下安全使用内置锁,从而释放其全部性能潜力。文中通过时序图、流程图和代码示例,详细对比了优化前后的执行流程,展示了JDK 24如何将锁所有权从平台线程转移到虚拟线程,实现无阻塞的高效并发。这一改进无需开发者修改代码即可获得显著的吞吐量提

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 2588

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java 24 中,synchronized 不再导致虚拟线程被锁定

Java 21 引入的虚拟线程,对 Java 的多线程开发产生了深远的影响。下面首先简单回顾一下 Java 中的虚拟线程。Java 中的线程分成平台线程和虚拟线程。平台线程是重量级的,与操作系统的原生线程一一对应,由操作系统进行调度。应用所能创建的平台线程数量受限。虚拟线程是轻量级的,由 Java 运行时负责创建和调度。虚拟线程所耗费的资源很少。可创建的虚拟线程的数量,在理论上仅受限于系统的内存大...

成富的专栏 1331

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java线程中的常用方法_[多线程] 线程中的常用方法-最详细

线程中常用的方法1、public void start()  使该线程开始执行;Java 虚拟机调用该线程的 run 方法。2、public void run() 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。3、public final void setName(String name) 改变线程名称...

weixin_35598854的博客 256

Python24个常用模块!

恭喜你,已经完成了Python常用模块的探险之旅!每个模块都如同一块拼图,当你将它们熟练运用到实际项目中,便能构建出强大而优雅的Python应用。1.动手实践:阅读本文的同时,打开Python环境尝试运行示例代码,理解其工作原理。2.深入学习:查阅官方文档或相关教程,了解模块中未提及的其他功能和用法。3.结合项目:在实际项目中寻找机会应用所学模块,解决具体问题,提升实战经验。4.定期回顾:定期复习模块知识,更新自己的技能库,保持对Python生态的敏感度。编程之路永无止境,持续学习与实践是进步的关键。

Python_trys的博客 4406

24点游戏(python)

24点游戏(python) 一、题目要求 1.问题描述: 24点游戏是经典的纸牌益智游戏。常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。 2.基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序...

Elf.筱焱的博客 1万+

剑指JUC原理-3.线程常用方法及状态

直接调用run是在主线程中执行了run,并没有启用新的线程,而使用start是启动新的线程,通过新的线程简介执行了run中的代码。

爱吃知识的土豆倪的博客 789

Java学习32-Java 多线程Thread 线程的常用方法

suspend()会导致线程暂停但不释放任何锁资源,其它线程都无法访问被它占用的锁,直到resume().下面的例子中括号里分别用了数字和来定义setPriority(),都是可以使用的,值得注意的是,对于多核CPU,资源抢占获得的优先级在运行结果处并不是十分明显。join():在线程A通过线程B调用join,表示线程A进入阻塞状态,CPU直接去执行线程B,直到线程B执行结束,线程A停止阻塞再继续执行。yield():静态方法,一旦调用,该线程直接释放CPU的执行权(getName():获取线程名。

weixin_42892630的博客 295

24张图带你彻底理解Java线程池

线程池是Java并发编程中非常重要的工具,它通过复用线程、控制并发数等机制,有效解决了线程资源管理的问题。掌握线程池的原理和使用技巧,可以帮助我们构建高性能、稳定的并发应用。避免使用Executors创建线程池,自定义ThreadPoolExecutor以掌控参数合理设置工作队列容量,避免OOM风险根据任务特性设置线程数量,CPU密集型和IO密集型任务采用不同策略实现监控,及时发现并处理线程池异常状态优雅关闭线程池,避免资源泄露。

doke99的博客 1035

5种常用的线程池

目录0 概述1 newCachedThreadPool(可缓存的线程池)2 newFixedThreadPool(固定大小的线程池)3 newScheduledThreadPool(可做任务调度的线程池)4 newSingleThreadPool(单个线程的线程池)5 newWorkStealingPool(足够大小的线程池) 0 概述 Java定义了Executor接口并在该接口中定义了execute()用于执行一个线程任务,然后通过ExecutorService接口实现Executor接口并执行具体的

sc179的博客 7088

Java多线程的常用方法

1. 获取线程的名字: String name = currentThread.getName(); 2. 设置线程的名字: currentThread.setName(“t1”); 3. 获取当前线程: Thread currentThread = Thread.currentThread(); 4. 唤醒线程 t.interrupt(); package Demo; public class ThreadMethod { public static void mai

China_I_Love_You的博客 247

Java八股之多线程(粗总结)Apr 24

笔者在Java求职实习岗位的关于Java线程的总结与思考

m0_68818004的博客 1008
上一篇: 23.多线程
下一篇: 3. 生产者消费者问题
cuichen97
博客等级 码龄7年 34粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值