首頁 > 軟體

Java檢視和修改執行緒優先順序操作詳解

2022-08-22 14:00:02

檢視和修改執行緒優先順序

1.題目

JAVA中每個執行緒都有優化級屬性,預設情況下,新建的執行緒和建立該執行緒的執行緒優先順序是一樣的。當執行緒排程器選擇要執行的執行緒時,會選擇優先順序高的執行緒。

實現:檢視和修改執行緒的優先順序

2.解題思路

建立一個類:ThreadPriorityTest,繼承了JFrame。用來介面顯示當前執行緒組中執行的執行緒。

定義2個方法:

  • do_this_windowActivated():用來監聽表單啟用事件
  • do_button_actionPerformed() :用來單擊修改按鈕事件,獲取使用者輸入的優先順序和選擇的行,修改執行緒優先順序。

Thread是程式中的執行執行緒。JAVA虛擬機器器允許應用程式並行地執行多個執行執行緒。

3.程式碼詳解

package com.xiaoxuzhu;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
/**
 * Description: 
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改記錄:
 * 修改後版本	        修改人		修改日期			修改內容
 * 2022/5/11.1	    xiaoxuzhu		2022/5/11		    Create
 * </pre>
 * @date 2022/5/11
 */

public class ThreadPriorityTest extends JFrame {

    /**
     *
     */
    private static final long serialVersionUID = 1127454227002083871L;
    private JPanel contentPane;
    private JTable table;
    private JTextField textField;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ThreadPriorityTest frame = new ThreadPriorityTest();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public ThreadPriorityTest() {
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowActivated(WindowEvent e) {
                do_this_windowActivated(e);
            }
        });
        setTitle("檢視和修改執行緒優化級");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.SOUTH);

        JLabel label = new JLabel("新優先順序(1~10)");
        label.setFont(new Font("微軟雅黑", Font.PLAIN, 16));
        panel.add(label);

        textField = new JTextField();
        textField.setFont(new Font("微軟雅黑", Font.PLAIN, 16));
        panel.add(textField);
        textField.setColumns(10);

        JButton button = new JButton("修改");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                do_button_actionPerformed(e);
            }
        });
        button.setFont(new Font("微軟雅黑", Font.PLAIN, 16));
        panel.add(button);

        JScrollPane scrollPane = new JScrollPane();
        contentPane.add(scrollPane, BorderLayout.CENTER);

        table = new JTable();
        table.setFont(new Font("微軟雅黑", Font.PLAIN, 14));
        table.setRowHeight(30);
        JTableHeader header = table.getTableHeader();
        header.setFont(new Font("微軟雅黑", Font.PLAIN, 16));
        header.setPreferredSize(new Dimension(header.getWidth(), 35));
        scrollPane.setViewportView(table);
    }

    protected void do_this_windowActivated(WindowEvent e) {
        ThreadGroup group = Thread.currentThread().getThreadGroup();// 獲得當前執行緒所線上程組
        Thread[] threads = new Thread[group.activeCount()];// 使用陣列儲存活動狀態的執行緒
        group.enumerate(threads);// 獲得所有執行緒
        DefaultTableModel model = (DefaultTableModel) table.getModel(); // 獲得表格模型
        model.setRowCount(0); // 清空表格模型中的資料
        model.setColumnIdentifiers(new Object[] { "執行緒ID", "執行緒名稱", "優先順序" }); // 定義表頭
        for (Thread thread : threads) {// 增加行資料
            model.addRow(new Object[] { thread.getId(), thread.getName(), thread.getPriority() });
        }
        table.setModel(model);// 更新表格模型
    }

    protected void do_button_actionPerformed(ActionEvent e) {
        String text = textField.getText();
        Integer priority = Integer.parseInt(text);
        int selectedRow = table.getSelectedRow();
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        model.setValueAt(priority, selectedRow, 2);
        repaint();
    }
}

執行緒列表和對應優先順序:

修改執行緒優先順序:

修改結果:

到此這篇關於Java檢視和修改執行緒優先順序操作詳解的文章就介紹到這了,更多相關Java執行緒優先順序內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com