欲善编程,多看、多敲、多讨论;动眼、动手、动大脑。
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 结束语
人人都是程序员,感谢您的阅读,欢迎关注。
领取专属 10元无门槛券
私享最新 技术干货