线程的启动与优先级
start() 和 run() 的区别
start()源码:
if (threadStatus != 0) throw new IllegalThreadStateException();
状态验证,不等于 NEW 则会抛出异常
group.add(this);
通知线程组,此线程即将启动
catch (Throwable ignore) { }
不做任何异常处理,如果抛出异常,则会被传递到调用的方法中
run()源码:
run()方法其中是重写的 Runnable 接口中的 run 方法。而 start() 方法是属于 Thread 自身的方法,并且使用了 synchronized,保证了线程安全。
start() 方法是开启线程的方法,让线程从 NEW 状态转换成 RUNNABLE 状态,而 run() 方法只是一个普通的方法,不会对线程的状态有所影响。
线程的优先级
什么是线程的优先级?线程优先级被线程调度用来判定何时每个线程允许被优先运行。理论上优先级高的线程比优先级低的线程有几率获得更多的 CPU 时间。并不是说优先级搞的线程一定先执行。
在 java 线程 Thread 类的源代码中,线程优先级的属性有 3 个:
MIN_PRIORITY 表示线程可以拥有的最小优先级
NORM_PRIORITY 表示线程默认优先级
MAX_PRIORITY 表示线程可以拥有的最大优先级
修改线程优先级的方法:setPriority(),源码:
if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) { }
验证优先级的合理性,如果在合理范围之外,则会抛出 IllegalArgumentException 异常
if (newPriority > g.getMaxPriority()) { newPriority = g.getMaxPriority();}
优先级如果超过线程组的最高优先级,则把优先级设置为线程组的最高优先级,所以线程的优先级有可能并不会和设置的值一样,还要取悦于线程组的优先级。
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/bad53d3bf7d3acd116d4366be】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论