在Java 6中,为什么即使优先级较低的线程产生,优先级较高的线程也不会运行?

Qua*_*dir 1 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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

  1. 主:1
  2. 线程0:1
  3. 线程0:1
  4. 主:1
  5. 线程1:10
  6. 线程1:10

任何帮助是极大的赞赏.

谢谢,Quadir

Mar*_*ers 9

我猜你的第一个线程甚至在第二个线程启动之前就已经完成了.也许如果你的线程做了一些真正的工作(或者甚至只是睡了一下),你会看到来自两个线程的重叠消息.

您的代码的另一个问题是您messages从多个线程访问而没有同步.

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

一旦你定这一切,一个最终的一点是,这两个你的线程产生,而不仅仅是低优先级的线程.当优先级较高的线程产生时,较低优先级的线程获得一些运行时间是完全合理的.拥有更高的优先权并不会给你带来垄断.在您的简化代码示例中,优先级可能不会对发生的情况产生太大影响 - 这将主要取决于哪个线程首先命中yield语句.