Java 如何确保线程获得最大优先级?

Java 如何确保线程获得最大优先级?,java,multithreading,java.util.concurrent,Java,Multithreading,Java.util.concurrent,我有一个缓冲区,许多线程将在其中写入(每次写入时递减CountDownLatch计数)。我还有一个线程(我们称之为主线程)在等待同一个CountDownLatch实例。不管怎样,我是否可以确保主线程是在计数为零时立即调度的线程?将最大优先级赋予主线程是否有效?或者还有其他可靠的方法吗 每当我们在Java中创建线程时,它总是有一些优先级分配给它。优先级可以由JVM在创建线程时给出,也可以由程序员显式地给出 线程的可接受优先级值在1到10之间。线程类中为优先级定义了3个静态变量: 1.公共静态int

我有一个缓冲区,许多线程将在其中写入(每次写入时递减CountDownLatch计数)。我还有一个线程(我们称之为主线程)在等待同一个CountDownLatch实例。不管怎样,我是否可以确保主线程是在计数为零时立即调度的线程?将最大优先级赋予主线程是否有效?或者还有其他可靠的方法吗

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

线程的可接受优先级值在1到10之间。线程类中为优先级定义了3个静态变量:
1.公共静态int最小优先级:这是线程可以拥有的最小优先级。该值为1。
2.public static intNORM_PRIORITY:如果未明确定义线程,则这是线程的默认优先级。该值为5。
3.公共静态int最大优先级:这是线程的最大优先级。这个值是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());

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

线程的可接受优先级值在1到10之间。线程类中为优先级定义了3个静态变量:
1.公共静态int最小优先级:这是线程可以拥有的最小优先级。该值为1。
2.public static intNORM_PRIORITY:如果未明确定义线程,则这是线程的默认优先级。该值为5。
3.公共静态int最大优先级:这是线程的最大优先级。这个值是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());

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

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

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


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


所以您本质上希望等待条件的线程具有最高优先级?这没有多大意义。您是否因为该线程的“优先级太低”而面临一些问题?这是实际的要求,因为缓冲区中存在所需数量的MSG,我需要将它们推送到其他位置,这是应该首先发生的活动。因此,执行此操作的线程必须抢占其他所有线程。
因此执行此操作的线程必须抢占其他所有线程。
-您应该使用适当的同步,而不是摆弄操作系统调度程序语义。因此,您本质上希望等待条件的线程具有最高优先级?这没有多大意义。您是否因为该线程的“优先级太低”而面临一些问题?这是实际的要求,因为缓冲区中存在所需数量的MSG,我需要将它们推送到其他位置,这是应该首先发生的活动。因此,执行此操作的线程必须抢占其他所有线程。
因此执行此操作的线程必须抢占其他所有线程。
-您应该使用适当的同步,而不是摆弄操作系统调度程序语义。是的,但我不希望所有其他线程在到达障碍后等待,它们必须继续运行。有了CyclicBarrier,就没有办法让团队中的其他线程继续运行。是的,但我不想让所有其他线程在到达屏障后等待,它们必须继续运行。使用CyclicBarrier,无法保持组中其他线程的运行。