首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果你的多线程总出错,请了解下他们并行的交通规则

欲善编程,多看、多敲、多讨论;动眼、动手、动大脑。

1 线程运行的红绿灯

红灯停、绿灯行。Thread.sleep()方法就是线程的红灯;参入一个参数的时候,参数的意义是毫秒数,1000毫秒等于1秒;传入两个参数的时候,前面的表示毫秒数,后面的表示纳秒数,1000纳秒等于1毫秒。

Thread.sleep()只是让线程暂停运行一段时间,而interrupt()则是把线程直接报废。不再继续运行了。注意,一般在使用interrupt需要先判断线程是否已被中断,用isInterrupted()方法判断,返回的是boolean类型,表示线程是否被中断。稍微注意,如果线程是正常运行,返回的是false,如果线程已被中断,则返回的是true。

2 霸道与礼让

霸道的线程,可以先执行完,再让其他线程执行。犹如铁路红绿灯路口,当火车准备通过的时候,行人和车都要让行。只有等火车完全通过之后,行人与车才能恢复正常通信。实现霸道线程优先的方法是:thread.join()。各位请注意,霸道线程是放到其他线程里面使用。比如线程A是霸道线程,线程B是普通线程。那么在线程B的run方法中,调用线程A的join方法。则会在调用join方法的地方,线程B停止运行,一直等到线程A执行完毕,线程B才开始继续执行。

如果觉得觉得霸道线程导致线程B停止运行与业务场景不符,只是希望线程B在某些节点上,给线程A适当礼让,礼让后,不论线程A是否执行结束,线程B继续执行。那么请调用线程礼让方法:Thread.yield()。当线程遇到yield方法是,只会做短暂的礼让,礼让后继续与其他线程并发执行。

3 线程的优先级

线程类提供了三个默认的优先级常量,分别是:优先级最高的Thread.MAX_PRIORITY,对应的int值是10,优先级中等的Thread.NORM_PRIORITY,对应的int值是5,最低优先级Thread.MIN_PRIORITY,对应的int值是1。

设置线程优先级的方法是,thread.setPriority();参数类型是int。我们可以调用线程类预设的三个优先级参数,也可以自行传入一个int数值。

线程也提供了获取线程优先级的方法,thread.getPriority();主线程的优先级是5,创建的普通线程,默认的优先级也是5。所以在之前的报数程序中,我们看到主线程和其他线程并发执行报数。

4 测试代码及运行效果

创建两个报数线程,线程A、线程B。等线程B准备报数3的时候,执行线程A.join方法。执行结果,线程B报完0/1/2后,线程A开始报数,直到线程A报数结束,线程B继续报数。代码及执行结果如下图。

线程是java代码最有趣的一部分,大家可以多动手试试,明天通过两个现实生活中的场景,让大家了解线程的同步与死锁的真面目。

5 结束语

人人都是程序员,感谢您的阅读,欢迎关注。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200303A04BU000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券