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
- 线程0:1
- 线程0:1
- 主:1
- 线程1:10
- 线程1:10
任何帮助是极大的赞赏.
谢谢,Quadir
我猜你的第一个线程甚至在第二个线程启动之前就已经完成了.也许如果你的线程做了一些真正的工作(或者甚至只是睡了一下),你会看到来自两个线程的重叠消息.
您的代码的另一个问题是您messages从多个线程访问而没有同步.
您还应该在尝试打印内容之前加入您已经启动的两个线程messages,以确保您启动的线程已经记录了它们的消息,并且在您迭代它时它们不会尝试修改列表打印它.
一旦你定这一切,一个最终的一点是,这两个你的线程产生,而不仅仅是低优先级的线程.当优先级较高的线程产生时,较低优先级的线程获得一些运行时间是完全合理的.拥有更高的优先权并不会给你带来垄断.在您的简化代码示例中,优先级可能不会对发生的情况产生太大影响 - 这将主要取决于哪个线程首先命中yield语句.