java - 在 Java 6 中,为什么即使低优先级线程让步,高优先级线程也不会运行?

标签 java multithreading

在下面的代码中,我试图通过让出优先级较低的线程来让优先级较高的线程运行。但它似乎不起作用,较高优先级线程似乎在较低优先级线程完成后运行。谁能解释我做错了什么?

import java.util.ArrayList;
import java.util.List;

public class TestThreadPriority extends Thread {

    static List<String> messages = new ArrayList<String>();

    public void run() {
        Thread t = Thread.currentThread();
        int priority = t.getPriority();
        String name = t.getName();
        messages.add(name + ":" + priority);        
        Thread.yield();
        messages.add(name + ":" + priority);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Thread t = Thread.currentThread();
        t.setPriority(MIN_PRIORITY);
        int priority = t.getPriority();
        String name = t.getName();
        messages.add(name + ":" + priority);

        Thread tp1 = new TestThreadPriority();
        tp1.setPriority(MIN_PRIORITY);      
        Thread tp2 = new TestThreadPriority();
        tp2.setPriority(MAX_PRIORITY);      

        tp1.start();
        tp2.start();

        Thread.yield();
        messages.add(name + ":" + priority);

        for(int i = 0; i < messages.size(); i++) {
            System.out.println((i+1) + ". " + messages.get(i));
        }
    }
}

输出是:

  1. main:1
  2. Thread-0:1
  3. Thread-0:1
  4. main:1
  5. Thread-1:10
  6. Thread-1:10

非常感谢任何帮助。

谢谢, 四边形

最佳答案

我猜你的第一个线程甚至在第二个线程开始之前就已经执行完了。也许如果您的线程做了一些实际工作(或者甚至只是睡了一会儿),您会看到来自两个线程的重叠消息。

您的代码的另一个问题是您在没有同步的情况下从多个线程访问消息

在尝试打印 messages 的内容之前,您还应该加入您启动的两个线程,以确保您启动的线程已经记录了它们的消息并且它们不会尝试在迭代列表以打印它时修改列表。

一旦您解决了所有这些问题,最后一点是您的线程两个 都在让步,而不仅仅是优先级较低的线程。当优先级较高的线程让步时,优先级较低的线程获得一些运行时间是完全合理的。拥有更高的优先级并不会给你垄断。在您简化的代码示例中,优先级可能不会对所发生的事情产生太大影响——这主要取决于哪个线程首先命中 yield 语句的机会。

关于java - 在 Java 6 中,为什么即使低优先级线程让步,高优先级线程也不会运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1971430/

相关文章:

c++ - 在 boost::thread 线程中使用异常

java - 编译我的简单 Java 文件期间出现编译错误

java - java 线程如何使 UI 响应更快?

java - 如何使用 Scanner 从 Java 中的 STDIN 静默读取?

Java JIT 编译器导致 OutOfMemoryError

c# - 暂停/恢复 For 循环?

c++ - 如果我在锁定互斥锁之前解锁它可以吗?

java - 改进类的多个实例访问同一类中多个同步函数的工作流程

java - 如何在网格系统中导航芭比娃娃?

java - 检测 JTextArea 上的悬停