我有一个缓冲区,可以在其中写入许多线程(每次写入都会减少CountDownLatch的计数)。我也有一个线程(称为主线程)在同一CountDownLatch实例上等待。无论如何,一旦计数达到零,我是否可以确保主线程是立即调度的线程?将最大优先级赋予主线程是否有效?还是还有其他健壮的方法?
答案 0 :(得分: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());
答案 1 :(得分:1)
通过查看您的要求,即当缓冲区中有所需数量的消息时,需要将这些消息推送到其他位置。您可以做的是在缓冲区上创建某种侦听器,以侦听/侦听缓冲区的状态,并在达到所需状态时可以使其他线程放弃控制(可以通过yield的概念来完成) ,然后线程调度程序将寻找优先级相同或更高的其他线程,并将处理器分配给该线程(应该是将消息推送到其他位置的线程),其他线程将进入“就绪/可运行”状态。
答案 2 :(得分:0)
我想说最大优先级意味着您希望在达到特定的障碍/阈值时尽可能减少线程调度的开销。这就是CyclicBarrier设计的目的,即在到达回调被调用的屏障之后立即
。https://www.geeksforgeeks.org/java-util-concurrent-cyclicbarrier-java/