设置 Java 线程的优先级

     2023-02-22     168

关键词:

【中文标题】设置 Java 线程的优先级【英文标题】:Setting priority to Java's threads 【发布时间】:2009-10-24 13:04:38 【问题描述】:

我有一个在几个线程中运行的程序。主线程与其他线程共享一个对象,在主线程中我调用:

synchronized(obj)
    do stuff

我怀疑主线程处于饥饿状态,无法访问obj。如何提高主线程的优先级,还是默认已经高于其他线程的优先级?

【问题讨论】:

Macarse 已经处理了如何更改优先级,但也许您可以粘贴更多代码。可能还有其他问题,或者是让其他线程花更少的时间在 obj 上同步的方法。 如何设置20个线程的优先级,因为线程的优先级是1-10,也就是说只能给9个线程优先级......?? 【参考方案1】:

您在 Thread 类中有一个 setPriority() 方法。

检查this javadoc。

将线程优先级设置为最大值:

public static void main(String args[]) 
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    // Your main code.

【讨论】:

所以你说 - 在我创建的每个线程中都执行 setPriority(minimum)。您知道将主线程的优先级设置为最大值的方法吗?它有什么不同吗? 我编辑了我的帖子,介绍了如何为您的主线程设置最大优先级。我不认为这会有所作为。我真的不知道你在做什么,但 Java 线程不应该需要你改变优先级来避免饥饿。 如何设置20个线程的优先级,因为线程的优先级是1-10,也就是说只能给9个线程优先级......?? @anshulkatta 不。您可以为多个线程提供相同的优先级。请记住:优先级只是一个提示。它不一定承诺任何事情。如果您需要 3 个以上的优先级,那么您可能会过度设计。 @ylun.ca 优先级只是相对的。给予一切最高优先级与给予最低优先级相同。【参考方案2】:

here系列文章指出了各个平台线程优先级管理的一些复杂性。

我想知道您的根本问题是否仅仅是您的工作线程非常占用 CPU 资源,因此很少达到自然“放开”处理器的程度(例如通过执行一些 IO 或休眠)。如果是这样的话在这种情况下,您可能会在这些工作人员中包含一些对 yield() 的调用,从而为其他线程提供更多机会。

【讨论】:

【参考方案3】:

您可以使用 setPriority() 方法。例如:

new MyThread("Foo").start(); 
Thread bar = new MyThread("Bar"); 
bar.setPriority( Thread.NORM_PRIORITY + 1 ); 
bar.start();

这为 bar 提供了新的优先级,应该很快接管 Foo

编辑:

要回答您的评论,您可以使用以下方法设置最大优先级:

bar.setPriority( Thread.MAX_PRIORITY );

【讨论】:

但您将 MAX_PRIORITY 设置为线程而不是主线程。【参考方案4】:

增加主线程优先级的方式 Macarse 说可能会起作用。但是,您依赖平台的抢占式线程调度程序才能正常工作。你应该在你的工作线程中调用Thread.yield() 静态方法,当它们完成了它们正在运行的任何重要代码部分时。即使您使用不同级别的线程优先级,这也是一个养成的好习惯。

【讨论】:

【参考方案5】:

正如其他人已经回答的那样,您确实可以为线程设置优先级,如下所示:

Thread.currentThread().setPriority(priority);

但请注意,在您的示例中,线程优先级与线程访问同步对象的顺序无关。 Java 使用其他标准来授予访问权限。 参见例如this。

【讨论】:

java线程优先级(代码片段)

线程的优先级:1、Max_PRIORITY:102、Min_PRIORITY:13、NORM_PRIORITY:5(此为默认优先级)如何获得和设置当前线程的优先级:getPriority():获得当前线程的优先级;setPriority():设置当前线程的优先级。... 查看详情

java多线程_优先级

一:java多线程优先级范围在1~10,小于1或大于10,则会抛出IllegalArgumentException异常值越大优先级越高。一般理解为:优先级高的获得cpu的几率更大些。只是几率更大些。其余没别的什么。  设置优先级通过setPriority方法。  如... 查看详情

java基础_多线程2[线程控制]

多线程2[线程控制]1.线程调度以及设置线程优先级(1).线程调度的俩种模型A:分时调度模型所有的线程轮流使用CPU的使用权,平均分配每一个线程占用CPU的时间片。 B:抢占式调度模型优先让优先级高的线程使用使用CPU,如果优先级... 查看详情

java多线程优先级休眠(未完待续...)(代码片段)

文章目录1、获取线程名称、修改线程名称2、线程的优先级3、线程的休眠1、获取线程名称、修改线程名称 //改名前: //获取当前正在执行线程的详细信息 Threadthread=Thread.currentThread(); //打印详细信息 System.out.println(thread... 查看详情

java学习-7

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

线程的优先级(代码片段)

在操作系统中,线程可以划分优先级的,优先级较高的线程得到的CPU资源较多。(也就是说比那些优先级比自己低的线程执行速度快)设置线程的优先级使用setPriority()方法。在java中,线程的优先级可以分为1-10个等级,小于1或... 查看详情

三.线程优先级和守护进程

1.线程的优先级  在操作系统中,线程可以划分优先级,优先级高的线程得到的CPU资源较多,也是CPU优先执行优先级较高的线程对象中的任务。  设置线程优先级有助于帮“线程规划器”确定在下一次选择哪一个线程... 查看详情

11.5-全栈java笔记:线程基本信息和优先级别

...“活”着,即线程是否还未终止。getPriority()获得线程的优先级数值setPriority()设置线程的优先级数值setName()给线程一个名字getName()取得线程的名字currentThread()取得当前正在运行的线程对象,也就是取得自己本身 【示例1】线程... 查看详情

线程优先级

packageyouxianji.xianchen;importjava.util.MissingFormatArgumentException;/**设置线程的优先级*setPrioritypublicfinalvoidsetPriority(intnewPriority)参数:newPriority-要为线程设定的优先级Java中三种优先级staticintMAX_PRIORITY线程可以具有 查看详情

java线程中常用的方法详解(代码片段)

...t=newT();//设置线程名称t.setName("筱路");//设置线程优先级,这里设置最小优先级为1t.setPriority(Thread.MIN_PRIORITY);t.start();//启动子线程//主线程打印5hi之后就中断子线程的休眠for(inti=0;i<5;i++)tryThread.sleep(1000);System... 查看详情

java并发编程并发基础——线程(代码片段)

...法显著提升该程序的执行效率。3.线程基础(1)优先级——setPriority(int)线程优先级决定线程需要多或者少分配一些处理器资源的线程属性设置线程优先级时,针对频繁阻塞(休眠或者I/O操作)的线程需要设置... 查看详情

二十线程的优先级

优先级高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务。设置线程优先级有助于“线程规划器”确定下一次选择哪一个线程来优先执行。Java中,线程的优先级分为1~10这10个等级,如果小于1或大于1... 查看详情

java--多线程之join,yield,sleep;线程优先级;定时器;守护线程(代码片段)

一、线程常用方法/**1、获取当前线程对象Threadt=Thread.currentThread();2、获取线程对象的名字Stringname=线程对象.getName();3、修改线程对象的名字线程对象.setName("线程名字");4、当线程没有设置名字的时候,默认的名字Th... 查看详情

线程的优先级设置

1Thread.currentThread().setPriority(Thread.MAX_PRIORITY);//高优先级23Thread.currentThread().setPriority(Thread.MIN_PRIORITY);//低优先级设置优先级时应该通过currentThread()来获取当前的Thread对象,以此Thread对象调用setPriority()来设置优先级; 查看详情

线程组(代码片段)

...作,如将一个线程组设置为守护线程,获取线程组的最大优先级等。packagecom.test;publicclassMyRunnableimplementsRunnable@Overridepubli 查看详情

java多线程--优先级

1.线程优先级的介绍java中的线程优先级的范围是1~10,默认的优先级是5。“高优先级线程”会优先于“低优先级线程”执行。java中有两种线程:用户线程和守护线程。可以通过isDaemon()方法来区别它们:如果返回false,则说明该... 查看详情

java线程调度及相关函数(代码片段)

...章目录Java线程调度线程调度相关方法代码案例设置线程优先级调用yield暂停当前线程Java线程调度线程调度抢占式调度模型:那个线程的优先级比较高,抢到的CPU时间片的概率就高一些/多一些。java采用的就是抢占式调度... 查看详情

java线程调度及相关函数(代码片段)

...章目录Java线程调度线程调度相关方法代码案例设置线程优先级调用yield暂停当前线程Java线程调度线程调度抢占式调度模型:那个线程的优先级比较高,抢到的CPU时间片的概率就高一些/多一些。java采用的就是抢占式调度... 查看详情