线程优先级

  在初识并发这篇博客提到过,Java的线程机制是抢占式的:这表示调度机制会周期性地中断线程,将上下文切换到另一个线程,从而为每隔线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动它的任务。

  尽管CPU处理现有线程集的顺序是不确定的,但是调度器倾向于让优先权最高的线程先执行,而优先权较低的线程并非没有机会执行,只是执行的频率较低。我们可以用getPriority()读取现有线程的优先级,使用setPriority来修改它:

public class LiftOff implements Runnable {

    public LiftOff(int priority){
        taskCount++;// 计数自增
        this.priority = priority;
    }

    private int        countDown = 3;        // 倒计时数字

    private static int taskCount = 0;

    private int        id        = taskCount;

    private int priority;

    @Override
    public void run() {
        Thread.currentThread().setPriority(priority);//设置优先级 Thread.currentThread()可获得对驱动该任务的Thread()对象的引用
        while (countDown >= 0) {
            System.out.println("线程编号" + id + "--倒计时" + countDown);
            countDown--;
            if(countDown < 0){
                System.out.println(Thread.currentThread() + ":" + id);
            }
        }
    }
}

调用线程启动任务:

public class Launch {

    public static void main(String[] args) {
        ExecutorService executor = Executors.newCachedThreadPool();
        executor.execute(new LiftOff(Thread.MAX_PRIORITY));
        executor.execute(new LiftOff(Thread.MIN_PRIORITY));
    }
}

输出:

线程编号0--倒计时3
线程编号1--倒计时3
线程编号1--倒计时2
线程编号0--倒计时2
线程编号0--倒计时1
线程编号0--倒计时0
线程编号1--倒计时1
Thread[pool-1-thread-1,10,main]:0
线程编号1--倒计时0
Thread[pool-1-thread-2,1,main]:1

  可以发现我们通过构造函数设置的线程优先级并没有起到预想的效果,java编程思想的作者提供了一个程序,在任务之中加入复杂的计算操作,以便让线程调度器得以介入并优先执行优先级高的线程,用他的话说”至少在我的WINXP“系统中是这样。很遗憾,我在我的电脑上并没有得到预期的效果。

  所以,在绝大多数时间里,所有线程都应该以默认的优先级运行。试图操纵线程优先级通常是一种错误

时间: 2024-11-06 19:22:29

线程优先级的相关文章

编程思想之多线程与多进程(2)——线程优先级与线程安全

原文:http://blog.csdn.net/luoweifu/article/details/46701167 作者:luoweifu 转载请标名出处 <编程思想之多线程与多进程(1)--以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础.本文将接着讲一下线程优先级和线程安全. 线程优先级 现在主流操作系统(如Windows.Linux.Mac OS X)的任务调度除了具有前面提到的时间片轮转的特点外,还有优先级调度(Prior

C#的线程类之Thread类以及对为什么设置线程优先级却不先执行这一问题本身的认识

1.C#对线程进行操作时,通过Thread类,可以对线程进行创建.挂起.恢复.休眠.终止及设置优先级. Thread类位于System.Threading命名空间下,该命名空间还包含一个ThreadPool类(允许用户使用系统提供的线程池)和一个Timer类(在线程池上执行回调方法) 在线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中.用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操系统会接收该优先级 2.Thr

015 线程优先级

线程优先级 ● 线程优先级 ○ Windows的每一个可调度的线程分配了一个优先级(0-31),当系统准备去执行一条线程时,会首先看优先级为31的行程,并以循环的方式来进行 调度,只要有优先级为31的线程,操作系统将永远不会调用30以下的线程,这样看起来好像优先级较低的线                程永远得不到被执行的机会,但是其实系统当大部分线程都是属于不可调度状态的,譬如,当调用了GetMessage函数后,会导致线程休眠,从而变成了不可调度状态. ○ 还需要提出的一个问题是 ○ 优先级

Cocos2dx中线程优先级

Cocos2dx中线程优先级问题 不论是ios还是android,遇到耗时的任务都要另起线程处理,否则程序不能及时用户的反馈.游戏中如果一圈循环不能在1/frameRate(帧率是30则1/30)秒内完成,就会有掉帧,游戏卡顿.比如,游戏中要解析一个动画json配置,需要60ms,这如果在主线程中搞就掉帧了,那么另再开个线程解析json,解析完了再通知主线程如何?这是可以的,但是考虑一种极端情况,线程切换到json解析线程,直到json解析完成后才切换到主线程,这不是一样掉帧吗!所以理想情况是让

第10章 线程控制(2)_线程属性和线程优先级

3. 线程属性 3.1 线程属性结构体 (1)pthread_attr_t结构体 (2)线程属性初始化和销毁 头文件 #include <pthread.h> 函数 int pthread_attr _init(pthread_attr_t* attr); //初始化 int pthread_attr_destroy(pthread_attr_t* attr); //销毁 返回值 成功返回0,否则返回错误编号 3.2 设置和获取分离属性 头文件 #include <pthread.h&g

java线程优先级

java的线程优先级分为1-10 这10个等级 1为最强,最优先 10为最弱 如果大于10或者小于1则会抛异常 源代码为: public final void setPriority(int newPriority) { ThreadGroup g; checkAccess(); if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) { throw new IllegalArgumentException(); } if((

《Windows via C/C++》学习笔记 —— 线程优先级【转】

转自:http://www.cnblogs.com/wz19860913/archive/2008/08/04/1259807.html 每个线程都有一个“优先级”,范围是0-31,0为最低优先级,31为最高优先级.当系统决定哪个线程需要调度的时候,首先查看是否存在优先级为31的可调度线程,如果存在,就从中选择一个进行调度.当该线程的时间片到达之后,系统查看是否存在另一个优先级为31的可调度线程,如果存在,就调度它. 只要有一个可调度的优先级为31的线程存在,那么系统绝对不会调度优先级为0-30

JAVA并发,线程优先级

1 package com.xt.thinks21_2; 2 3 import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 6 /** 7 * java线程优先级测试 8 * 9 * @author Administrator 10 * 11 */ 12 public class ThreadPriorityTest implements Runnable { 13 privat

线程优先级抢占实验【RT-Thread学习笔记 3】

同时处于就绪状态的线程,优先级高的先执行. 高优先级就绪时,低优先级任务让出CPU,让高优先级任务先执行. 创建两个任务函数: //线程优先级抢占 void thread1_entry(void *parameter) { rt_uint32_t count = 0; while(1) { for(;;count++) { rt_thread_delay(3*RT_TICK_PER_SECOND); //等三秒输出一次 rt_kprintf("count = %d\n",count);

五、线程优先级和守护线程

java 中的线程优先级的范围是1-10,默认的优先级是5.“高优先级线程”会优先于“低优先级线程”执行.优先比不是绝对. java 中有两种线程:用户线程和守护线程.可以通过isDaemon()方法来区别它们:如果返回false,则说明该线程是“用户线程”:否则就是“守护线程”. 用户线程一般用户执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务.需要注意的是:Java虚拟机在“用户线程”都结束后会后退出. 在一些运行的主线程中创建新的子线程时,子线程的优先级被设置为等于“创建