线程优先级无效
Thread priorities no effect
我正在 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 只是模拟长 运行ning 操作,如下所示:
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 个线程时需要牢记几件事。
- 线程优先级规则高度依赖于系统。什么时候
虚拟机依赖宿主机的线程实现
平台,线程调度受该线程支配
实施。
- 经验法则:在任何给定时间,最高优先级的线程是
运行宁。但是,这并不能保证。 线程调度程序可能
选择 运行 优先级较低的线程以避免饥饿 。为了这
原因,使用线程优先级只是为了影响调度策略
效率目的。不要依赖它来保证算法的正确性。
- 如果有多个 运行nable 线程具有相同的线程会怎样
(最高优先级?选择最高优先级的线程之一。
如何在两者之间进行仲裁完全取决于线程调度程序
相同优先级的线程。 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
--------
查看 this 了解更多详情。
我正在 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 只是模拟长 运行ning 操作,如下所示:
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 个线程时需要牢记几件事。
- 线程优先级规则高度依赖于系统。什么时候 虚拟机依赖宿主机的线程实现 平台,线程调度受该线程支配 实施。
- 经验法则:在任何给定时间,最高优先级的线程是 运行宁。但是,这并不能保证。 线程调度程序可能 选择 运行 优先级较低的线程以避免饥饿 。为了这 原因,使用线程优先级只是为了影响调度策略 效率目的。不要依赖它来保证算法的正确性。
- 如果有多个 运行nable 线程具有相同的线程会怎样 (最高优先级?选择最高优先级的线程之一。 如何在两者之间进行仲裁完全取决于线程调度程序 相同优先级的线程。 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
--------
查看 this 了解更多详情。