【问题标题】:How to ensure that a thread gets maximum priority?如何确保线程获得最大优先级?
【发布时间】:2023-04-02 15:17:01
【问题描述】:

我有一个缓冲区,许多线程将在其中写入(每次写入减少 CountDownLatch 的计数)。我还有一个线程(我们称之为主线程)在同一个 CountDownLatch 实例上等待。无论如何,一旦计数达到零,我是否可以确保主线程是立即安排的线程?给予主线程最大优先级有效吗?还是有其他稳健的方法?

【问题讨论】:

  • 所以你本质上想要最高优先级的线程等待条件?这没有多大意义。您是否因为这个线程的“优先级太低”而面临一些问题?
  • 这是实际要求,因为缓冲区中有所需数量的 msg,我需要将它们推送到其他位置,这是应该首先发生的活动。因此,执行此操作的线程必须抢占其他所有线程。
  • So the thread that does this has to preempt every other thread. - 您应该使用适当的同步,而不是摆弄操作系统调度程序语义。

标签: java multithreading java.util.concurrent


【解决方案1】:

每当我们在 Java 中创建一个线程时,它总是被分配一些优先级。优先级可以由JVM在创建线程时给定,也可以由程序员显式给定。

线程接受的优先级值在 1 到 10 的范围内。在 Thread 类中定义了 3 个用于优先级的静态变量:
1. public static int MIN_PRIORITY:这是线程可以拥有的最低优先级。其值为 1。
2. public static int NORM_PRIORITY:如果没有明确定义,这是线程的默认优先级。其值为 5。
3. public static int MAX_PRIORITY:这是线程的最大优先级。其值为 10。

 ThreadDemo t1 = new ThreadDemo();
 t1.setPriority(2);

 // Main thread  
 System.out.print(Thread.currentThread().getName());
 System.out.println("Main thread priority : " + Thread.currentThread().getPriority());

 // Main thread priority is set to 10
 Thread.currentThread().setPriority(10);
 System.out.println("Main thread priority : " + Thread.currentThread().getPriority());

【讨论】:

    【解决方案2】:

    通过查看您的要求,即当缓冲区中有所需数量的消息时,需要将这些消息推送到其他位置。您可以做的是在缓冲区上创建某种侦听器,轮询/侦听缓冲区的状态,当达到所需状态时,您可以让其他线程放弃控制(这可以通过屈服的概念来完成) ,然后线程调度程序将寻找具有相同或更高优先级的其他线程,并将处理器分配给该线程(应该是将消息推送到其他位置的线程),其他线程将进入就绪/可运行状态。

    【讨论】:

      【解决方案3】:

      我认为说最大优先级意味着您希望在达到某个障碍/阈值时尽可能减少线程调度的开销。这就是 CyclicBarrier 的设计目的,即在它到达屏障后立即调用回调。

      https://www.geeksforgeeks.org/java-util-concurrent-cyclicbarrier-java/

      【讨论】:

      • 是的,但我不希望所有其他线程在到达屏障后等待,它们必须继续运行。使用 CyclicBarrier 无法保持群中的其他线程运行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2011-06-25
      • 2012-01-04
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多