18.5 线程的优先级

  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 }
View Code

猜你喜欢

转载自www.cnblogs.com/studycode/p/9582287.html