素材搜集网站返利网站开发计划书
- 作者: 五速梦信息网
- 时间: 2026年04月20日 08:24
当前位置: 首页 > news >正文
素材搜集网站,返利网站开发计划书,WordPress 微盘,手机写wordpress博客上次分享到了#xff0c;多线程中是是如何创建的#xff0c;那么接下来#xff0c;小编继续分享下多线程的相关知识。 多线程中的一些基本属性。 基本属性 属性获取方法IDgetId()名称getName()状态getState()优先级getPriority()是否后台线程isDemo()是否存活isAlive()是…上次分享到了多线程中是是如何创建的那么接下来小编继续分享下多线程的相关知识。 多线程中的一些基本属性。 基本属性 属性获取方法IDgetId()名称getName()状态getState()优先级getPriority()是否后台线程isDemo()是否存活isAlive()是否被中断isInterrupted() 那么其中这些属性名称有着什么意思呢 ID是线程唯一的标识不同线程不会重复 这里是jvm自动分配的不能手动设置 名称是各种调试工具用到的东西可以帮助调试和日志记录 Thread对象的身份标识 状态表示线程当前所处的一个情况 一般初学听的更多是就绪/阻塞 后面详细介绍。 优先级影响线程调度一个工具理论上来说优先级高的更容易被调度到 设置不同的优先级会影响系统的调度这里的影响有着多种因素 操作系统调度算法、优先级映射…… 后台线程特殊类型的线程主要是为程序提高服务和支持功能。 有着后台线程那么也有着前台线程 那么又是前台线程呢 前台线程也是一个特殊线程默认创建的。 有个值得注意的前台线程会影响jvm的退出前台线程结束后jvm才会退出。 后台线程是不会影响jvm的退出的。 存活可以简单理解为执行run方法是否结束了 线程中断用于请求线程停止当前工作的一种机制。 ok接下来以一个代码来演示下 public static void main(String[] args) {Thread tnew Thread(()-{while (true){System.out.println(hello world);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();//获取线程属性//获取IDSystem.out.println(ID:t.getId());//线程名字System.out.println(name:t.getName());//线程状态System.out.println(状态t.getState());//线程优先级System.out.println(优先级t.getPriority());//是否是后台线程System.out.println(前台/后台:t.isDaemon());//是否存活System.out.println(是否存活t.isAlive());//是否被中断System.out.println(是否被中断t.isInterrupted());} 在代码运行期间截了以下的运行图 从运行结果来看ID被jvm自动分配为22 name被jvm自动填充为Thread-0 这里值得注意的是main方法也是一个线程还是个主线程而且有着自己独属的名字 就直接命名为main 而后创建的线程从Thread-n开始这是默认填充名字n从0开始 状态则显示为TIMED_WAITING 这里简单介绍下这里的几种状态 状态含义例子NEW线程被创建但尚未启动新买的车还没发动。RUNNABLE线程正在执行或准备执行车辆在路上行驶。BLOCKED线程等待获取锁等待电梯开门。WAITING线程无限期等待另一个线程执行特定操作在咖啡店等朋友不确定他们什么时候到。TIMED_WAITING线程等待一段时间后继续执行在咖啡店等朋友但只愿意等 10 分钟TERMINATED线程已完成执行不能再次启动完成购物并离开商店。 从图中可以看到优先级为5 那么此时这个5是什么意思呢 在Java的优先级中优先级是一个整数值范围到MIN_PRIORITY(1)-MAX_PRIORITY(10); Thread.MIN_PRIORITY: 最低优先级值为 1。Thread.NORM_PRIORITY: 默认优先级值为 5。Thread.MAX_PRIORITY: 最高优先级值为 10。 接着看到是否存活很显然线程run方法执行的内容是死循环所以是存在这个线程即存活 值得注意的是我们是通过创建线程对象任何才有通过对象去创建线程。 那么此时可能会出现Thread对象存在但是线程是不存在的了注意是不会出现线程存在Thread对象不存在的 比如1.调用start之前内核中还没创建线程呢 2.线程中的run方法执行完毕了内核中的线程自然就无了但此时Thread对象仍然存在 是否被中断这里的中断内容后续会讲到。 那么接下来讲讲这个线程的一些核心操作 一些核心操作 1.线程创建 这个前一篇文章已经讲述过了噢那么接下来仅仅补充下 这个线程创建即是调用这个start方法那么值得注意的是start方法不能启动多次只能一次 因为一个Thread对象对应一个线程在jvm中。 多次启动后的报错信息 还有就是在线程中是可以启动其他线程的也可以创建其他线程的 不只是在main方法中去创建线程。 2.线程的中断 即是一个线程结束 在java中这个线程中断结束是比较温柔的做法 假设B正在运行那么此时A想让B结束 那么A就是想办法把B的run() 方法运行完即可。 这里有一个简单直接的做法可以演示 public class Demo11 {private static boolean isQuitfalse;public static void main(String[] args) throws InterruptedException {//不能写在内部因为我们下面创建线程任务是使用lambda表达式写在内部涉及到变量捕获 // boolean isQuitfalse;Thread tnew Thread(()-{while (!isQuit){System.out.println(hello world);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();Thread.sleep(2000);//在这里影响t线程结束isQuittrue;System.out.println(t线程结束);} } 当然还有一个方法就是通过Thread.currentThread()获取到当前线程的实例去判断下是否被中断了 public static void main(String[] args) throws InterruptedException {Thread tnew Thread(()-{//获取当前线程的引用Thread currentThreadThread.currentThread();//默认为falsewhile (!currentThread.isInterrupted()){System.out.println(hello world);try {Thread.sleep(1000);} catch (InterruptedException e) {System.out.println(catch语句已执行);break; // throw new RuntimeException(e);}}});t.start();Thread.sleep(4000);//这里来控制t线程结束调用后currentThread.isInterrupted()返回truet.interrupt();} 此时为什么会执行到catch语句的内容呢? 这是因为在主线程中呢t.interrupt();会让这个中断标志设置为true一开始为false。 那么此时t线程中的sleep正在休眠此时会导致sleep抛出InterruptedException此时呢就会执行到catch语句代码 值得注意的是sleep唤醒后又会重新设置这个中断标志位即恢复默认情况 那么此时如若我们呢catch语句没有中断操作除了它它还是会继续打印hello world代码。 所以Interrupt方法能够设置标志位也能唤醒sleep等阻塞方法 而且sleep方法唤醒后又能清空标志位。 3.线程等待 我们之前讲到这个操作系统针对多个线程的执行是一个随机调度抢占式执行的过程。 那么这个线程等待呢就是确定两个线程的“结束顺序” 比如A线程中调用B.join(),那么这个意思就是让A线程等待B线程 先结束然后再执行A线程的内容 这个join就是线程等待的关键字。 我们可以使用一个代码来演示下 public static void main(String[] args) throws InterruptedException {Thread t1new Thread(()-{for(int i0;i4;i){System.out.println(hello t1);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});Thread t2new Thread(()-{for(int i0;i4;i){System.out.println(hello t2);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t1.start();t2.start();t1.join();t2.join(); 所以运行结果中可能会带着交替出现的效果。 由于是线程是随机调度的所以打印结果有可能使交替出现也有可能不是。 这里我们使main主线程等待t1、t2线程 那么其实也可以t1等待t2线程或者也可以t2等待t1甚至多个线程进行等待 那么刚刚使用的这个是无参版本的 那么此时这个join有可能就是会出现死等的情况有时候往往不是一个好选择 所以java这里呢提供了两个带参数的版本 public void joinlong millis等待线程结束最多等待millis毫秒public void joinlong millisint nanos同理但是提供的精度会更高 所以我们如若使用到这个带参数的版本这样等预定的时间过后就会执行其他任务了而不是死等了。 完~
- 上一篇: 素材动图网站在线视频教育网站开发
- 下一篇: 素材网站哪个值得买wordpress主题 错误
相关文章
-
素材动图网站在线视频教育网站开发
素材动图网站在线视频教育网站开发
- 技术栈
- 2026年04月20日
-
苏州做网站最好公司网站建设自动适应功能
苏州做网站最好公司网站建设自动适应功能
- 技术栈
- 2026年04月20日
-
苏州做网站好的公司微信定制开发 网站开发
苏州做网站好的公司微信定制开发 网站开发
- 技术栈
- 2026年04月20日
-
素材网站哪个值得买wordpress主题 错误
素材网站哪个值得买wordpress主题 错误
- 技术栈
- 2026年04月20日
-
素材网站视频搭建一个网站需要哪些技术
素材网站视频搭建一个网站需要哪些技术
- 技术栈
- 2026年04月20日
-
素材网站源码wordpress跳转链接地址
素材网站源码wordpress跳转链接地址
- 技术栈
- 2026年04月20日
