1、每个线程都具有各自的优先级,线程的优先级可以表明在程序中该线程的重要性,如果有很多线程处于就绪状态,系统会根据优先级来决定首先使哪个线程进入运行状态。但这并不意味着低优先级的线程得不到运行,而只是它运行的几率比较小,如垃圾回收线程的优先级就较低。
2、Thread类中包含的成员变量代表了线程的某些优先级,如Thread.MIN_PRIORITY(常数1)、Thread.MAX_PRIORITY(常数10)、Thread.NORM_PRIORITY(常数5)。其中每个线程的优先级都在Thread.MIN_PRIORITY和Thread.MAX_PRIORITY之间,在默认情况下其优先级都是Thread.NORM_PRIORITY。每个新产生的线程都继承了父线程的优先级。
3、在多任务操作系统中,每个线程都会得到一小段CPU时间片运行,在时间结束时,将轮换另一个线程进入运行状态,这时系统会选择与当前线程优先级相同的线程予以运行。系统时钟选择就绪状态下优先级较高的线程进入运行状态。处于各个优先级状态下的线程的运行顺序如下图所示:
4、线程的优先级可以使用setPriority()方法调整,如果使用该方法设置的优先级不在1~10之间,将产生IllegalArgumentException异常。

1 package com.lzw; 2 3 import java.awt.*; 4 5 import javax.swing.*; 6 7 public class PriorityTest extends JFrame { 8 /** 9 * 10 */ 11 private static final long serialVersionUID = 1L; 12 private Thread threadA; 13 private Thread threadB; 14 private Thread threadC; 15 private Thread threadD; 16 17 public PriorityTest() { 18 getContentPane().setLayout(new GridLayout(4, 1)); 19 // 分别实例化4个线程 20 final JProgressBar progressBar = new JProgressBar(); 21 final JProgressBar progressBar2 = new JProgressBar(); 22 final JProgressBar progressBar3 = new JProgressBar(); 23 final JProgressBar progressBar4 = new JProgressBar(); 24 getContentPane().add(progressBar); 25 getContentPane().add(progressBar2); 26 getContentPane().add(progressBar3); 27 getContentPane().add(progressBar4); 28 progressBar.setStringPainted(true); 29 progressBar2.setStringPainted(true); 30 progressBar3.setStringPainted(true); 31 progressBar4.setStringPainted(true); 32 threadA = new Thread(new MyThread(progressBar)); 33 threadB = new Thread(new MyThread(progressBar2)); 34 threadC = new Thread(new MyThread(progressBar3)); 35 threadD = new Thread(new MyThread(progressBar4)); 36 setPriority("threadA", 5, threadA); 37 setPriority("threadB", 5, threadB); 38 setPriority("threadC", 4, threadC); 39 setPriority("threadD", 3, threadD); 40 } 41 42 // 定义设置线程的名称、优先级的方法 43 public static void setPriority(String threadName, int priority, 44 Thread t) { 45 t.setPriority(priority); // 设置线程的优先级 46 t.setName(threadName); // 设置线程的名称 47 t.start(); // 启动线程 48 } 49 50 public static void main(String[] args) { 51 init(new PriorityTest(), 100, 100); 52 } 53 54 public static void init(JFrame frame, int width, int height) { 55 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 56 frame.setSize(width, height); 57 frame.setVisible(true); 58 } 59 60 private final class MyThread implements Runnable { // 定义一个实现Runnable接口的类 61 private final JProgressBar bar; 62 int count = 0; 63 64 private MyThread(JProgressBar bar) { 65 this.bar = bar; 66 } 67 68 public void run() { // 重写run()方法 69 while (true) { 70 bar.setValue(count += 10); // 设置滚动条的值每次自增10 71 try { 72 Thread.sleep(1000); 73 } catch (InterruptedException e) { 74 System.out.println("当前线程序被中断"); 75 } 76 } 77 } 78 } 79 80 }