线程的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,那么编译器会报错
相关文章
|
17天前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
29 1
|
30天前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
53 0
|
2月前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
127 29
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
2月前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
1月前
|
存储 运维 API
源码解密协程队列和线程队列的实现原理(一)
源码解密协程队列和线程队列的实现原理(一)
34 1
|
1月前
|
存储 安全 API
源码解密协程队列和线程队列的实现原理(二)
源码解密协程队列和线程队列的实现原理(二)
32 1
|
1月前
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
31 1
|
2月前
|
并行计算 API 调度
探索Python中的并发编程:线程与进程的对比分析
【9月更文挑战第21天】本文深入探讨了Python中并发编程的核心概念,通过直观的代码示例和清晰的逻辑推理,引导读者理解线程与进程在解决并发问题时的不同应用场景。我们将从基础理论出发,逐步过渡到实际案例分析,旨在揭示Python并发模型的内在机制,并比较它们在执行效率、资源占用和适用场景方面的差异。文章不仅适合初学者构建并发编程的基础认识,同时也为有经验的开发者提供深度思考的视角。
|
3月前
|
存储 监控 Java
|
3月前
|
安全 Java 开发者
Swing 的线程安全分析
【8月更文挑战第22天】
58 4