线程优先级无效



我正在用Java编写一个饥饿模拟。然而,当我运行它时,它几乎在任何时候都不起作用。我正在开发MacOS。代码如下:

public class StarvationNew {
private static SharedObject sharedObject = new SharedObject(); // to jest ten obiekt (operacja) na ktorym sie blokuje
private static volatile boolean isActive = true;
public static void main(String[] args) {
Thread t1 = new Thread(new Worker(), "Thread_1");
Thread t2 = new Thread(new Worker(), "Thread_2");
Thread t3 = new Thread(new Worker(), "Thread_3");
t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MAX_PRIORITY);
t3.setPriority(Thread.MIN_PRIORITY);
t1.start();
t2.start();
t3.start();

try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
isActive = false;
}
private static class Worker implements Runnable {
private int runCount = 0;
@Override
public void run() {
while(isActive) {
sharedObject.playOperation();
runCount++;
}
System.out.println("--------");
System.out.println(Thread.currentThread().getName() + " ended with: " + runCount);
System.out.println("--------");
}
}

}

SharedObject只是模拟长时间运行的操作,看起来像这样:

public class SharedObject {
public synchronized void playOperation() {
try {
// long operations
System.out.println(Thread.currentThread().getName());
Thread.sleep(150);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}

我想知道这段代码中的错误是什么。

使用Java线程时需要记住以下几点。

  1. 线程优先级的规则高度依赖于系统。什么时候虚拟机依赖于主机的线程实现平台,线程调度取决于该线程执行
  2. 经验法则:在任何给定时间,最高优先级的线程是跑步然而,这并不能保证线程调度程序可能选择运行优先级较低的线程以避免饥饿。为此原因,仅使用线程优先级来影响的调度策略效率目的。不要依赖它来保证算法的正确性
  3. 如果有多个可运行的线程具有相同的(最高(优先级?优先级最高的线程之一被选中。如何在两者之间进行仲裁完全取决于线程调度程序具有相同优先级的线程。Java编程语言没有确保所有线程都得到公平处理

如上所述,在我的Windows 10(Java 8(机器上,我没有看到以下输出有任何异常:

Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_1
Thread_3
--------
Thread_1 ended with: 34
--------
--------
Thread_2
Thread_3 ended with: 1
--------
--------
Thread_2 ended with: 1
--------

请查看此以了解更多详细信息。

最新更新