线程的3种实现方式并深入源码简单分析实现原理(2)

简介: 线程的3种实现方式并深入源码简单分析实现原理(2)

关键属性


  • name
表示Thread的名字,
可以通过Thread类的构造器中的参数来指定线程名字


  • priority


线程的优先级(最大值为10,最小值为1,默认值为5)


  • daemon


线程是否是守护线程,如果在main线程中创建了一个守护线程,当main方法运行完毕之后,守护线程也会随着消亡。在JVM中,垃圾收集器线程就是守护线程


  • target


要执行的任务


  • group


线程群组


关键方法


  • start


start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源


  • run


run()方法是不需要用户来调用的,当通过start方法启动一个线程之后,当线程获得了CPU执行时间,便进入run方法体去执行具体的任务。注意,继承Thread类必须重写run方法,在run方法中定义具体要执行的任务


  • sleep


有2个重载版本


public static native void sleep(long millis) throws InterruptedException;
public static void sleep(long millis, int nanos) throws InterruptedException;


sleep让线程睡眠,交出CPU,让CPU去执行其他的任务。
sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,
则即使调用sleep方法,其他线程也无法访问这个对象。
sleep方法相当于让线程进入阻塞状态。


  • yield


调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。
它跟sleep方法类似,同样不会释放锁。
但是yield不能控制具体的交出CPU的时间,
另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。
注意,调用yield方法并不会让线程进入阻塞状态,
而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,
这一点是和sleep方法不一样的。


  • join


有三个重载版本


join()
join(long millis)     //参数为毫秒
join(long millis,int nanoseconds)    //第一参数为毫秒,第二个参数为纳秒
可以看出,当调用thread.join()方法后,main线程会进入等待,然后等待thread执行完之后再继续执行


image.png


join方法实际上调用的是Object的wait方法
wait方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。


  • interrupt


nterrupt,中断。
单独调用interrupt方法可以使得处于阻塞状态的线程抛出一个异常,
也就说,它可以用来中断一个正处于阻塞状态的线程


  • stop


stop方法已经是一个废弃的方法,它是一个不安全的方法。
因为调用stop方法会直接终止run方法的调用,并且会抛出一个ThreadDeath错误,
如果线程持有某个对象锁的话,会完全释放锁,导致对象状态不一致。
所以stop方法基本是不会被用到的。


Runnable


image.png


函数式编程 FunctionInterface


该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。
加上该注解能够更好地让编译器进行检查。
如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错
相关文章
|
1月前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
138 1
|
2月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
6月前
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
6月前
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
7月前
|
Java 中间件 调度
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
253 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
283 1
|
10月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
708 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
281 0
|
8月前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
380 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
|
12月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
238 12

热门文章

最新文章