java线程优先级设置,java线程优先级有几级
如何解决写爬虫IP受阻的问题?立即使用。
Java 线程优先级
在Thread类中,以下属性用于表示优先级。
私有int优先级;我们可以通过setPriority(int newPriority)设置新的优先级,通过getPriority()获取线程的优先级。
有资料通过下面的例子得出一个结论:Java线程的默认优先级是5。
公共静态void main(String[] args) {
Thread thread=新线程();
system . out . println(thread . get priority());
}
//打印结果:5。其实这是一个很大的错误,只是看到了表面。看下面这个例子。我们把当前线程的优先级改成了4,发现子线程thread的优先级也是4。
公共静态void main(String[] args) {
Thread.currentThread()。set priority(4);
Thread thread=新线程();
system . out . println(thread . get priority());
}
//打印结果:4这是当头一棒。如果是线程,默认优先级是5。我们新创建的线程Thread,没有设置优先级,应该是5,但实际上是4。我们来看看线程初始化优先级的源代码。
thread parent=currentThread();
this . priority=parent . get priority();最初,线程的默认优先级是继承父线程的优先级。在上面的例子中,我们将父线程的优先级设置为4,所以子线程的优先级也变成了4。
严格来说,子线程的默认优先级和父线程是一样的,Java主线程的默认优先级是5。
Java中定义了三种优先级,分别是最低优先级(1)、普通优先级(5)和最高优先级(10)。代码如下。Java优先级范围是[1,10],设置其他数字的优先级会抛出IllegalArgumentException异常。
/**
*线程可以拥有的最低优先级。
*/
public final static int MIN _ PRIORITY=1;
/**
*分配给线程的默认优先级。
*/
public final static int NORM _ PRIORITY=5;
/**
*线程可以拥有的最高优先级。
*/
public final static int MAX _ PRIORITY=10;接下来,我们来说说线程优先级的作用。先看下面的代码。代码的逻辑是创建3000个线程,即1000个优先级为1的线程、1000个优先级为5的线程和1000个优先级为10的线程。MinTimes用于记录1000个MIN_PRIORITY线程运行时时间戳的总和,normTimes用于记录1000个NORM_PRIORITY线程运行时时间戳的总和,maxTimes用于记录1000个MAX_PRIORITY线程运行时时间戳的总和。通过统计每个优先级操作的时间戳之和,值越小,执行的优先级越高。我们跑去看看吧。
公共类TestPriority {
static atomic long min times=new atomic long(0);
static atom clong norm times=new atom clong(0);
static AtomicLong max times=new AtomicLong(0);
公共静态void main(String[] args) {
ListMyThread minThreadList=new ArrayList();
ListMyThread normThreadList=new ArrayList();
ListMyThread maxThreadList=new ArrayList();
int count=1000
for(int I=0;我数;i ) {
MyThread MyThread=new MyThread( min- I);
myThread.setPriority(线程。MIN _ PRIORITY);
minthreadlist . add(myThread);
}
for(int I=0;我数;i ) {
MyThread MyThread=new MyThread( norm- I);
myThread.setPriority(线程。NORM _ PRIORITY);
norm threadlist . add(myThread);
}
for(int I=0;我数;i ) {
MyThread MyThread=new MyThread( max- I);
myThread.setPriority(线程。MAX _ PRIORITY);
maxthreadlist . add(myThread);
}
for(int I=0;我数;i ) {
maxThreadList.get(i)。start();
normThreadList.get(i)。start();
minThreadList.get(i)。start();
}
尝试{
thread . sleep(3000);
} catch (InterruptedException e) {
e . printstacktrace();
}
系统。出去。println(最高优先级统计:最大次数。get());
系统。出去。println(标准优先级统计:“正常时间。get());
minPriority统计:最小次数。get());
System.out.println(普通优先级与最高优先级相差时间:(规范倍。get()-最大次数。get()) ms );
System.out.println(最低优先级与普通优先级相差时间:(最小次数。get()-norm倍。get()) ms );
}
静态类神话故事扩展线程{
公共MyThread(字符串名称){
超级(名);
}
@覆盖
公共无效运行(){
系统。出去。println(这个。getname() priority: this。getpriority());
switch (this.getPriority()) {
案件线索。最高优先级:
最大次数。getandadd(系统。当前时间毫秒());
打破;
案件线索100 . NORM _优先级:
正常时间。getandadd(系统。当前时间毫秒());
打破;
案件线索。最小优先级:
最小次数。getandadd(系统。当前时间毫秒());
打破;
默认值:
打破;
}
}
}
}执行结果如下:
# 第一部分
最大- 0优先级:10
norm - 0优先级:5
最大一优先级:10
最大- 2优先级:10
规范- 2优先级:5
最小- 4优先级:1
.
马克斯- 899优先级:10
最小912优先级:1
最小847优先级:5
最小883优先级:1
# 第二部分
最大优先级统计:1568986695523243
非优先性统计:1568986695526080
minPriority统计:1568986695545414
普通优先级与最高优先级相差时间:2837毫秒
最低优先级与普通优先级相差时间:19334毫秒我们一起来分析一下结果。先看看第一部分,最开始执行的线程高优先级、普通优先级、低优先级都有,最后执行的线程也都有各个优先级的,这说明了:优先级高的线程不代表一定比优先级低的线程优先执行。也可以换另一种说法:代码执行顺序跟线程的优先级无关。看看第二部分的结果,我们可以发现最高优先级的1000 个线程执行时间戳之和最小,而最低优先级的1000 个线程执行时间戳之和最大,因此可以得知:一批高优先级的线程会比一批低优先级的线程优先执行,即高优先级的线程大概率比低优先的线程优先获得中央处理器资源。
各操作系统中真有 10 个线程等级么?
爪哇作为跨平台语言,线程有10 个等级,但是映射到不同操作系统的线程优先级值不一样。接下来教大家怎么在OpenJDK源码中查各个操作系统中线程优先级映射的值。
看到线源代码,设置线程优先级最终调用了本地方法设置优先级0();
private native void set priority 0(int new priority);接着我们在OpenJDK的线程。c代码中找到setPriority0()对应的方法JVM _ SetThreadPriority
静态JNINativeMethod方法[]={
.
{setPriority0 ,(I)V ,(void *)JVM_SetThreadPriority},
.};我们根据JVM_SetThreadPriority找到虚拟机。卡片打印处理机(Card Print Processor的缩写)中对应的代码段;
JVM_ENTRY(void,JVM _ SetThreadPriority(JNIEnv * env,jobject jthread,jint prio))
JVM包装( JVM _ SetThreadPriority );
//确保C线程和OSThread结构在我们操作之前没有被释放
互斥锁ml(Threads _ lock);
OOP Java _ thread=JNI句柄:resolve _ non _ null(jthread);
Java _ lang _ Thread:set _ priority(Java _ Thread,(线程优先级)prio);
Java Thread * thr=Java _ lang _ Thread:Thread(Java _ Thread);
如果(thr!=NULL) { //线程尚未启动;当优先级降低时
Thread:set_priority(thr,(线程优先级)prio);
}
JVM _结束根据第3步中的代码,我们可以发现关键是java_lang_Thread:set_Priority()这段代码,继续找线程。卡片打印处理机(Card Print Processor的缩写)代码中的set_Priority()方法;
void线程:set _ priority(线程*线程,线程优先级优先级){
跟踪(设置优先级,线程);
debug _ only(check _ for _ dangling _ thread _ pointer(thread);)
//可以返回错误!
(void)os:set_priority(线程,优先级);
}以上就是爪哇线程优先级的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。