Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程优先级无效_Java_Concurrency_Starvation - Fatal编程技术网

Java 线程优先级无效

Java 线程优先级无效,java,concurrency,starvation,Java,Concurrency,Starvation,我正在用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

我正在用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线程时,有几件事需要记住

  • 线程优先级的规则高度依赖于系统。什么时候 虚拟机依赖于主机的线程实现 在平台上,线程调度由该线程决定 实施
  • 经验法则:在任何给定时间,最高优先级的线程都是 跑步然而,这并不能保证线程调度程序可能会 选择运行低优先级线程以避免饥饿。为此 因此,仅使用线程优先级来影响的调度策略 效率目标。不要依赖它来判断算法的正确性
  • 如果有多个可运行线程具有相同的 (最高)优先权?将选取优先级最高的线程之一。 这完全取决于线程调度程序如何在两个线程之间进行仲裁 具有相同优先级的线程。Java编程语言没有给出 确保所有线程都得到公平对待
  • 如上所述,在我的Windows 10(Java 8)计算机上,我没有看到以下输出有任何异常:


    查看更多详细信息。

    你说不工作是什么意思?我知道Java程序只是操作系统的提示,但在我的例子中,几乎没有任何编译代码显示线程3不足。模拟饥饿的代码概念可以吗?谢谢你的帮助。我在Windows上运行了我的代码,它运行得很好,但这是一个饥饿的“好”例子,还是我应该考虑其他事情?@TomKo1不确定你所说的“饥饿”是什么意思。请定义它。我的意思是,一个贪婪的线程正在占用共享资源,并提供(有时他们获得访问权)其他线程来访问它。我的讲师曾经拒绝了我的代码,因为我在方法名的前面使用了synchronized关键字。饥饿在这里被描述为@TomKo1,我认为这是一个很好的例子,线程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_1
    Thread_3
    --------
    Thread_1 ended with: 34
    --------
    --------
    Thread_2
    Thread_3 ended with: 1
    --------
    --------
    Thread_2 ended with: 1
    --------