七.多线程编程7.线程优先级

Java程序小助手 Java程序小助手     2022-08-30     789

关键词:

线程优先级被线程调度用来判定何时每个线程允许运行。理论上,优先级高的线程比优先级低的线程获得更多的CPU时间。实际上,线程获得的CPU时间通常由包括优先级在内的多个因素决定(例如,一个实行多任务处理的操作系统如何更有效的利用CPU时间)。

一个优先级高的线程自然比优先级低的线程优先。举例来说,当低优先级线程正在运行,而一个高优先级的线程被恢复(例如从沉睡中或等待I/O中),它将抢占低优先级线程所使用的CPU。

理论上,等优先级线程有同等的权利使用CPU。但你必须小心了。记住,Java是被设计成能在很多环境下工作的。一些环境下实现多任务处理从本质上与其他环境不同。为安全起见,等优先级线程偶尔也受控制。这保证了所有线程在无优先级的操作系统下都有机会运行。实际上,在无优先级的环境下,多数线程仍然有机会运行,因为很多线程不可避免的会遭遇阻塞,例如等待输入输出。遇到这种情形,阻塞的线程挂起,其他线程运行。

但是如果你希望多线程执行的顺利的话,最好不要采用这种方法。同样,有些类型的任务是占CPU的。对于这些支配CPU类型的线程,有时你希望能够支配它们,以便使其他线程可以运行。

设置线程的优先级,用setPriority()方法,该方法也是Tread 的成员。它的通常形式为:
    final void setPriority(int level)

这 里 , level 指 定了对所调用的线程的新的优先权的设置。Level的值必须在MIN_PRIORITY到MAX_PRIORITY范围内。通常,它们的值分别是1和10。要返回一个线程为默认的优先级,指定NORM_PRIORITY,通常值为5。这些优先级在Thread中都被定义为final型变量。

你可以通过调用Thread的getPriority()方法来获得当前的优先级设置。该方法如下:
    final int getPriority( )

当涉及调度时,Java的执行可以有本质上不同的行为。Windows 95/98/NT/2000 的工作或多或少如你所愿。但其他版本可能工作的完全不同。大多数矛盾发生在你使用有优先级行为的线程,而不是协同的腾出CPU时间。最安全的办法是获得可预先性的优先权,Java获得跨平台的线程行为的方法是自动放弃对CPU的控制。

下面的例子阐述了两个不同优先级的线程,运行于具有优先权的平台,这与运行于无优先级的平台不同。一个线程通过Thread.NORM_PRIORITY设置了高于普通优先级两级的级数,另一线程设置的优先级则低于普通级两级。两线程被启动并允许运行10秒。每个线程执行一个循环,记录反复的次数。10秒后,主线程终止了两线程。每个线程经过循环的次数被显示。
// Demonstrate thread priorities.
class clicker implements Runnable {
     int click = 0;
    Thread t;
    private volatile boolean running = true;
    public clicker(int p) {
        t = new Thread(this);
        t.setPriority(p);
    }

    public void run() {
        while (running) {
            click++;
        }
    }

    public void stop() {
        running = false;
    }

    public void start() {
        t.start();
    }
}

class HiLoPri {
    public static void main(String args[]) {
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        clicker hi = new clicker(Thread.NORM_PRIORITY + 2);
        clicker lo = new clicker(Thread.NORM_PRIORITY - 2);
        lo.start();
        hi.start();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            System.out.println("Main thread interrupted.");
        }
        lo.stop();
        hi.stop();
        // Wait for child threads to terminate.
        try {
            hi.t.join();
            lo.t.join();
        } catch (InterruptedException e quqiongyule2.com ) {
            System.out.println("InterruptedException caught");
        }

        System.out.println("Low-priority thread: " + lo.click);
        System.out.println("High-priority thread: " + hi.click);
    }
}

该程序在Windows 98下运行的输出,表明线程确实上下转换,甚至既不屈从于CPU,也不被输入输出阻塞。优先级高的线程获得大约90%的CPU时间。
Low-priority thread: 4408112
High-priority thread: 589626904

当然,该程序的精确的输出结果依赖于你的CPU的速度和运行的其他任务的数量。当同样的程序运行于无优先级的系统,将会有不同的结果。

上述程序还有个值得注意的地方。注意running前的关键字volatile。尽管volatile 在下章会被很仔细的讨论,用在此处以确保running的值在下面的循环中每次都得到验证。
while (running) {
click++;
}

如果不用volatile,Java可以自由的优化循环:running的值被存在CPU的一个寄存器中,
每次重复不一定需要复检。volatile的运用阻止了该优化,告知Java running可以改变,改变
方式并不以直接代码形式显示。

七.多线程编程9.线程间通信

上述例题无条件的阻塞了其他线程异步访问某个方法。Java对象中隐式管程的应用是很强大的,但是你可以通过进程间通信达到更微妙的境界。这在Java中是尤为简单的。像前面所讨论过的,多线程通过把任务分成离散的和合乎逻... 查看详情

java多线程编程——多线程技能(代码片段)

...ume()方法的缺点——数据不完整四、yield()方法五、线程的优先级1.线程优先级的继承特性2.优先级的规律性3.优先级的随机性4.优先级对线程运行速度的影响六、守护线程总结前言作为多线程编程的第一章,主要介绍Thread类的... 查看详情

七.多线程编程6.isalive()和join()的使用

如前所述,通常你希望主线程最后结束。在前面的例子中,这点是通过在main()中调用sleep()来实现的,经过足够长时间的延迟以确保所有子线程都先于主线程结束。然而,这不是一个令人满意的解决方法,它也带来一个大问题:... 查看详情

七.多线程编程11.线程的挂起恢复和终止

有时,线程的挂起是很有用的。例如,一个独立的线程可以用来显示当日的时间。如果用户不希望用时钟,线程被挂起。在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事。挂起,终止和恢复线程... 查看详情

多线程编程(进程和线程)

...5种状态(New,Runnable,Running,Block,Dead):三、线程的优先级四、守护线程/精灵线程/后台线程五、方法六、同步代码锁(synchronized)一、创建 查看详情

java多线程编程核心技术学习-2

停止线程:暂停线程:yield方法:线程优先级:守护线程: 查看详情

多线程多进程和线程池编程

一.python中的GIL二.python多线程编程三.线程间通信-Queue四.线程同步(Lock、RLock、Semaphores、Condition)五.concurrent线程池编码六.多进程编程-multiprocessing七.进程间通信 查看详情

多线程编程学习笔记——线程同步

接上文 多线程编程学习笔记——线程同步(一)接上文多线程编程学习笔记——线程同步(二)  七、使用Barrier类Barrier类用于组织多个线程及时在某个时刻会面,其提供一个回调函数,每次线程调用了Sig... 查看详情

多线程编程之优先级翻转问题

一、什么是优先级翻转问题  所谓优先级翻转问题(PriorityInversion)即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优... 查看详情

网络编程——同一进程中的队列(多线程)

...queue.Queue()先进先出queue.LifoQueue()后进先出queue.PriorityQueue()优先级队列  优先级队列q=queue.PriorityQueue()    q.put()接受的是一个元祖    元祖中第一个参数是:表示当前数据的优先级    元祖中第二个参数是:需要存... 查看详情

线程八大基础核心六(线程属性)(代码片段)

...前情回顾在我们日常多线程编程中,需要关心线程的线程优先级有:线程Id线程名称是否是守护线程线程优先级#考考你1.你知道线程Id的作用吗?2.你知道线程名称的作用吗?3.你知道什么是守护线程吗?4.你知道守护线程与用户... 查看详情

多线程编程之线程基础(代码片段)

...Thread类实现多线程编程之前,我们先来看看Thread类结构:优先级:[1,10]线程状态:新建、就绪、阻塞、运行、死亡publicenumState 查看详情

java进阶多线程编程,程序员必备技能!

文章目录多线程编程线程的工作过程Java线程拥有优先级创建多线程1.继承Thread类,重写run()方法2.实现接口Runnable接口,实现run方法3.实现Callable接口,实现call方法线程的生命周期结语个人主张自学,但是也不能忘记了讨论的重要... 查看详情

多线程

...ava.lang.Thread类    实现java.lang.Runnable接口更改线程的优先级:setPriori 查看详情

linux操作系统多线程(代码片段)

...各种锁7.读者写者模型7.1基本概念7.2读写锁7.3基本操作7.4优先级4.线程池介绍一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分 查看详情

java学习-7

...,平均分配每个线程占用CPU的时间。抢占式调度:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。创建多线程的方式:方法一:创建Thread类的子类1.创建一个Threa... 查看详情

javase——多线程

...d()9、线程强制执行join()10、观察线程状态getState()11、线程优先级setPriority(1),getPriority()12、守护线程setDaemon(true)13、线程同步14、线程不安全三大案例15、实现线 查看详情

多线程(基础篇1)

...创建线程中止线程线程等待终止线程确定线程的状态线程优先级前台线程和后台线程向线程传递参数使用C#的lock关键字锁定线程使用Monitor锁定线程处理异常一、创建线程  在整个系列文章中,我们主要使用VisualStudio2015作为线... 查看详情