打字猴:1.700450059e+09
1700450059
1700450060 Priority:8
1700450061
1700450062 Priority:8
1700450063
1700450064 Priority:5
1700450065
1700450066 Priority:5
1700450067
1700450068 Priority:6
1700450069
1700450070 Priority:6
1700450071
1700450072 Priority:4
1700450073
1700450074 Priority:4
1700450075
1700450076 Priority:3
1700450077
1700450078 Priority:3
1700450079
1700450080 Priority:1
1700450081
1700450082 Priority:1
1700450083
1700450084 Priority:2
1700450085
1700450086 Priority:2
1700450087
1700450088 println方法虽然有输出损耗,可能会影响到输出结果,但是不管运行多少次,你都会发现两个不争的事实:
1700450089
1700450090 (1)并不是严格遵照线程优先级别来执行的
1700450091
1700450092 比如线程优先级为9的线程可能比优先级为10的线程先执行,优先级为1的线程可能比优先级为2的线程先执行,但很少会出现优先级为2的线程比优先级为10的线程先执行(这里用了一个词“很少”,是说确实有可能出现,只是几率非常低,因为优先级只是表示线程获得CPU运行的机会,并不代表强制的排序号)。
1700450093
1700450094 (2)优先级差别越大,运行机会差别越明显
1700450095
1700450096 比如优先级为10的线程通常会比优先级为2的线程先执行,但是优先级为6的线程和优先级为5的线程差别就不太明显了,执行多次,你会发现有不同的顺序。
1700450097
1700450098 这两个现象是线程优先级的一个重要表现,之所以会出现这种情况,是因为线程运行是需要获得CPU资源的,那谁能决定哪个线程先获得哪个线程后获得呢?这是依照操作系统设定的线程优先级来分配的,也就是说,每个线程要运行,需要操作系统分配优先级和CPU资源,对于Java来说,JVM调用操作系统的接口设置优先级,比如Windows操作系统是通过调用SetThreadPriority函数来设置的,问题来了:不同的操作系统线程优先级都相同吗?
1700450099
1700450100 这是个好问题。事实上,不同的操作系统线程优先级是不相同的,Windows有7个优先级,Linux有140个优先级,Freebsd则有255个(此处指的是优先级总数,不同操作系统有不同的分类,如中断级线程、操作系统级等,各个操作系统具体用户可用的线程数量也不相同)。Java是跨平台的系统,需要把这个10个优先级映射成不同操作系统的优先级,于是界定了Java的优先级只是代表抢占CPU的机会大小,优先级越高,抢占CPU的机会越大,被优先执行的可能性越高,优先级相差不大,则抢占CPU的机会差别也不大,这就是导致了优先级为9的线程可能比优先级为10的线程先运行。
1700450101
1700450102 Java的缔造者们也察觉到了线程优先问题,于是在Thread类中设置了三个优先级,此意就是告诉开发者,建议使用优先级常量,而不是1到10随机的数字。常量代码如下:
1700450103
1700450104 public class Thread implements Runnable{
1700450105
1700450106 //最低优先级
1700450107
1700450108 public final static int MIN_PRIORITY=1;
[ 上一页 ]  [ :1.700450059e+09 ]  [ 下一页 ]