当前位置: 首页 > news >正文

Java 线程Thread类中的方法

Java 线程Thread类中的方法

1 Thread的实例方法

1.1 join

public class JoinTest {public static void main(String [] args) throws InterruptedException {ThreadJoinTest t1 = new ThreadJoinTest("小明");ThreadJoinTest t2 = new ThreadJoinTest("小东");t1.start();/**join的意思是使得放弃当前线程的执行,并返回对应的线程,例如下面代码的意思就是:程序在main线程中调用t1线程的join方法,则main线程放弃cpu控制权,并返回t1线程继续执行直到线程t1执行完毕所以结果是t1线程执行完后,才到主线程执行,相当于在main线程中同步t1线程,t1执行完了,main线程才有执行的机会*/t1.join();t2.start();}}
class ThreadJoinTest extends Thread{public ThreadJoinTest(String name){super(name);}@Overridepublic void run(){for(int i=0;i<10;i++){System.out.println(this.getName() + ":" + i);}}
}

上面程序结果是先打印完小明线程,在打印小东线程;

上面注释也大概说明了join方法的作用:在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。注意,这里调用的join方法是没有传参的,join方法其实也可以传递一个参数给它的,具体看下面的简单例子:

public class JoinTest {public static void main(String [] args) throws InterruptedException {ThreadJoinTest t1 = new ThreadJoinTest("小明");ThreadJoinTest t2 = new ThreadJoinTest("小东");t1.start();/**join方法可以传递参数,join(10)表示main线程会等待t1线程10毫秒,10毫秒过去后,* main线程和t1线程之间执行顺序由串行执行变为普通的并行执行*/t1.join(10);t2.start();}}

上面代码结果是:程序执行前面10毫秒内打印的都是小明线程,10毫秒后,小明和小东程序交替打印。

所以,join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。

public class JoinTest {public static void main(String [] args) throws InterruptedException {ThreadJoinTest t1 = new ThreadJoinTest("小明");ThreadJoinTest t2 = new ThreadJoinTest("小东");/**join方法可以在start方法前调用时,并不能起到同步的作用*/t1.join();t1.start();t2.start();}
}

上面代码执行结果是:小明和小东线程交替打印。

所以得到以下结论:join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就无法同步了。

join方法实现原理

有了上面的例子,我们大概知道join方法的作用了,那么,join方法实现的原理是什么呢?

其实,join方法是通过调用线程的wait方法来达到同步的目的的。例如,A线程中调用了B线程的join方法,则相当于A线程调用了B线程的wait方法,在调用了B线程的wait方法后,A线程就会进入阻塞状态,具体看下面的源码:

从源码中可以看到:join方法的原理就是调用相应线程的wait方法进行等待操作的,例如A线程中调用了B线程的join方法,则相当于在A线程中调用了B线程的wait方法,当B线程执行完(或者到达等待时间),B线程会自动调用自身的notifyAll方法唤醒A线程,从而达到同步的目的。

1.2 interrupt

作用是中断本线程,本线程中断自己是被允许的;其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限。这有可能抛出SecurityException异常。

如果本线程是处于阻塞状态:调用线程的wait(), wait(long)或wait(long, int)会让它进入等待(阻塞)状态,或者调用线程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也会让它进入阻塞状态。若线程在阻塞状态时,调用了它的interrupt()方法,那么它的“中断状态”会被清除并且会收到一个InterruptedException异常。例如,线程通过wait()进入阻塞状态,此时通过interrupt()中断该线程;调用interrupt()会立即将线程的中断标记设为“true”,但是由于线程处于阻塞状态,所以该“中断标记”会立即被清除为“false”,同时,会产生一个InterruptedException的异常。

如果线程被阻塞在一个Selector选择器中,那么通过interrupt()中断它时;线程的中断标记会被设置为true,并且它会立即从选择操作中返回。

如果不属于前面所说的情况,那么通过interrupt()中断线程时,它的中断标记会被设置为“true”。

中断一个“已终止的线程”不会产生任何操作。

1.3 setDaemon

要想设置一个线程为守护线程,setDaemon必须在start前调用。

当一个应用程序的所有非守护线程停止运行时,即使仍有守护线程还在运行,该应用程序也将终止,反过来,只要还有非守护线程在运行,应用程序就不会停止。我们可以通过setDaemon(booleanon)来设置某线程为精灵线程。

用户线程不完,jvm系统就不完,要是想只运行"守护Daemon线程",对不起jvm不给面子,不伺候,就关闭了,不给"守护Daemon线程"们单独运行的机会。

2 Thread的静态方法

2.1 yield

Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。

yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!

举个例子:一帮朋友在排队上公交车,轮到Yield的时候,他突然说:我不想先上去了,咱们大家来竞赛上公交车。然后所有人就一块冲向公交车,

有可能是其他人先上车了,也有可能是Yield先上车了。

但是线程是有优先级的,优先级越高的人,就一定能第一个上车吗?这是不一定的,优先级高的人仅仅只是第一个上车的概率大了一点而已,

最终第一个上车的,也有可能是优先级最低的人。并且所谓的优先级执行,是在大量执行次数中才能体现出来的。

2.2 sleep

  • 主要是为了暂停当前线程,把cpu片段让出给其他线程,减缓当前线程的执行。
  • sleep是帮助其他线程获得运行机会的最好方法,但是如果当前线程获取到的有锁,sleep不会让出锁。
  • 线程睡眠到期自动苏醒,并返回到可运行状态(就绪),不是运行状态。
  • sleep()是静态方法,只能控制当前正在运行的线程。
  • 优先线程的调用,现在苏醒之后,并不会立马执行,所以sleep()中指定的时间是线程不会运行的最短时间,sleep方法不能作为精确的时间控制。

相关文章:

  • JavaScript 中如何跳出(或终止)forEach 循环
  • zabbix最新版本7.2超级详细安装部署(一)
  • Helix QAC 2025.1 重磅发布!MISRA C:2025® 100%覆盖
  • 【C++】【设计模式】生产者-消费者模型
  • 数据库--处理模型(Processing Model)
  • 有限资源下的AI搜索策略:2025年SEO优化指南
  • 在scala中使用sparkSQL读入csv文件
  • 前端面试每日三题 - Day 33
  • Vue 2 和 Vue 3的比较(二、语法差异)
  • 新一代动态可重构处理器技术,用于加速嵌入式 AI 应用
  • 索尼(sony)摄像机格式化后mp4的恢复方法
  • CAElinux系统详解
  • Retrofit vs Feign: 介绍、对比及示例
  • Spring Boot 跨域问题全解:原理、解决方案与最佳实践
  • Java GUI 开发之旅:Swing 组件与布局管理的实战探索
  • EBS 段值安全性配置
  • 【软件测试】第一章·软件测试概述
  • Spring AI 开发本地deepseek对话快速上手笔记
  • 理解计算机系统_并发编程(5)_基于线程的并发(二):线程api和基于线程的并发服务器
  • 正点原子T80烙铁拆解学习
  • 西安市未央区委书记刘国荣已任西咸新区党工委书记
  • 中东睿评|特朗普中东三国行:喧嚣的形式与空洞的实质
  • 中国-拉共体成员国重点领域合作共同行动计划(2025-2027)
  • 第四届长三角国际应急博览会开幕,超3000件前沿装备技术亮相
  • 寒武纪陈天石:公司的产品力获得了行业客户广泛认可,芯片市场有望迎来新增量需求
  • 李公明 | 一周画记:印巴交火会否升级为第四次印巴战争?