Các mức ưu tiên của luồng

Trong Java, mồi luồng có một mức ưu tiên thực hiện nhất định. Khi chương trinh chính thực hiện sẽ tạo ra luồng chính (luồng cha). Luồng này sẽ tạo ra các luồng con, và cứ thế tiếp tục. Theo mặc định, một luồng con sẽ kế thừa mức ưu tiên của luồng cha trưc tiếp của nó. Bạn có thể táng hay giâm mức ưu tiên của luồng bằng cách sử dụng hàm setPrioritỵ (). Mức ưu tiên của các luồng có thể đặt lại trong khoảng từ MIN_ PRIORI! Y (Trong lớp Thread được mặc định bang 1) và MAX PRIORITY (mặc định bằng 10), hoăc NORM PRIORITY (mặc định là 5).

Luồng có mức ưu tiên cao nhất trong số các luồng đang chiếm dụng tài nguyên sẽ tiếp tục thực hiện cho đến khi:

  • Nó nhường quyền điều khiển cho luồng khác bằng cách gọi hàm y.ie Ld ()
  • Nó dừng thực hiện (bị “chết” hoặc chuyển sang trạng thái bị chận)
  • Có một luồng với mức ưu tiên cao hơn vào trạng thái

Khi đó bộ lập lịch sẽ chọn luồng mới có mức ưu tiên cao nhất trong số những luồng ờ trạng thái Runnable để thực hiện.

Vấn đề náy sinh là chọn luồng nào để thực hiện khi có nhiều hơn một luồng sẫn sàng thực hiện và có cùng một mức ưu tiên cao nhất. Nói chung, một số cơ sớ sử dụng bộ lập lịch lựa chọn ngẫu nhiên, hoặc lựa chọn chúng để thực hiện theo thứ tự xuất hiện.

Ví dụ 1.3. Chúng ta hãy xót chương trình hiển thị các quả bóng màu xanh hoặc đỏ nảy (chuyền) theo những đường nhất định. Mỗi khi nhấn nút “Blue ball” thi có 5 luồng được tạo ra với mức ưu tiên thông thường (mức 5) để hiển thị và di chuyển các quả bóng xanh. Khi nhấn nút “Red ball” thì cũng có 5 luồng được tạo ra với mức ưu tiên (mức 7) cao hơn mức thông thường để hiển thị và di chuyển các quả bóng đỏ. Đề kết thúc trò chơi bạn nhấn nút “Close”.

//Bounce, java import java.awt.*; import j ava.awt.event.*; import j avax.swing.*; public class Bounce{ public static void main(String arg[]){

JFrame fr = new BounceFrame(); fr.show();

1

}

class BounceFrame extends JFrame{ public BounceFrame(){

setsize(300, 200); setTitle(“Bong chuyen”); addWindowListener(new WindowAdapter(){

public void windowclosing(WindowEvent e){

System.exit(0);

} }) ;

Container contentPane = getContentPane();

canvas = new JPanel();

contentPane.add(canvas, “Center”);

JPanel p = new JPanelO;

addButton(p, “Blue ball”, new ActionListener(){ public void actionPerformed(ActionEvent evt){ for(int i = 0; i < 5; Ì + +){

Ball b = new Ball(canvas, Color.blue) ; b.setPriority(Thread.NORM_PRIORITY) ; b.start();

}

}

addButton(p, “Red ball”, new ActionLìstener(){

public void actionPerformed(ActionEvent evt) { for(int i = 0; i < 5; i + + ) {

Ball b = new Ball(canvas, Color.red); b.setPriority(Thread.NORM_PRIORITY + 2); b.start () ;

addButton(p, “Close”, new ActionListener(){

public void actionPerformed(ActionEvent evt){ canvas.setVisible(false);

System.exit(0);

}

});

contentPane.add(p, “South”);

}

puhlic void addButtcn (Container c, String title, ArticnListener a) { JButton b = new JButton(title); c.add(b);

b.addActionListener(a);

}

private JPanel canvas;

class Ball extends Thread{ public Ball(JPanel b, Color c) { box = b; color = c;

1

public void draw(){

Graphics g = box.getGraphics(); g.setColor(color); g.fillOval(x, y, XSI2E, YSIZE) ; g.dispose();

}

public void move(){

if(!box.isVisible()) return;

Graphics g = box.getGraphics(); g.setXORMode(box.getBackground() ) ; g.setColor (color); g.fillOval(x, y, XSIZE, YSIZE); x += dx; y += dy;

Dimension d = box.getSize(); if(x < 0){

x = 0; dx = -dx;

}

if(x + XSIZE >= d.width){

x = d.width – XSIZE; dx = -dx;

}

if(y < 0){

y = 0; dy = -dy;

}

if(y + YSIZE >= d.height){

y = d.height – YSIZE; dy = -dy;

}

g.fillOval(x, y, XSIZE, YSIZE); g.dispose();

}

public void run(){ try {

for(int i — 1; i <= 1000; i++) { move(); sleep (5);

}

Jcatch(InterruptedException e){

)

}


}

Chạy chương trinh trên chúng ta nhận thấy hình như những quả bóng đỏ nhảy nhanh hơn vì các luồng thực hiện chúng có mức ưu tiên cao hơn.

Liru ỷ. Các luồng có mức ưu tiên thấp hơn sẽ không có cơ hội thực hiện nếu những luồng cao hơn không nhường, hoặc nhường bằng hàm yield (). Vì vậy, ờ hàm run () chúng ta sử dụng hàm sleep(5) để mỗi luồng sau một khoảng thời gian thực hiện thì đi “ngủ” 5 micro giây và dành quyền điều khiển cho luồng khác thực hiện. Hàm static void yield () được sử dụng để luồng đang thực hiện nhường quyền cho luồng khác thực hiện. Neu có những luồng đang ờ trạng thái Runnable mà có mức ưu tiên ít nhất bằng mức ưu tiên của luồng vừa nhường thỉ một trong số chúng được xếp lịch để thực hiện.

  • Bộ lập lịch thường xuyên tính lại mức ưu tiên cùa các luồng đang thực hiện
  • Tim luồng có mức ưu tiên cao nhất để thực hiện.