第18章 多线程----线程的优先级

每个线程都具有各自的优先级,线程的优先级可以表明在程序中该线程的重要性,如果有很多线程处于就绪状态,系统会根据优先级来决定使哪个线程进入运行状态。每个新产生的线程都继承了父线程的优先级。

例如:在项目中创建PriorityTest类,该类实现了Runnable接口。创建4个进度条,分别由4个线程来控制,并且为这4个线程设置不同的优先级。

import java.awt.*;

import javax.swing.*;

public class PriorityTest extends JFrame {
    private static final long serialVersionUID = 1L;
    private Thread threadA;
    private Thread threadB;
    private Thread threadC;
    private Thread threadD;

    public PriorityTest() {
        getContentPane().setLayout(new GridLayout(4, 1));
        // 分别实例化4个线程
        final JProgressBar progressBar = new JProgressBar();
        final JProgressBar progressBar2 = new JProgressBar();
        final JProgressBar progressBar3 = new JProgressBar();
        final JProgressBar progressBar4 = new JProgressBar();
        getContentPane().add(progressBar);
        getContentPane().add(progressBar2);
        getContentPane().add(progressBar3);
        getContentPane().add(progressBar4);
        progressBar.setStringPainted(true);
        progressBar2.setStringPainted(true);
        progressBar3.setStringPainted(true);
        progressBar4.setStringPainted(true);
        threadA = new Thread(new MyThread(progressBar));
        threadB = new Thread(new MyThread(progressBar2));
        threadC = new Thread(new MyThread(progressBar3));
        threadD = new Thread(new MyThread(progressBar4));
        setPriority("threadA", 5, threadA);
        setPriority("threadB", 5, threadB);
        setPriority("threadC", 4, threadC);
        setPriority("threadD", 3, threadD);
    }

    // 定义设置线程的名称、优先级的方法
    public static void setPriority(String threadName, int priority,
            Thread t) {
        t.setPriority(priority); // 设置线程的优先级
        t.setName(threadName); // 设置线程的名称
        t.start(); // 启动线程
    }

    public static void main(String[] args) {
        init(new PriorityTest(), 100, 100);
    }

    public static void init(JFrame frame, int width, int height) {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(width, height);
        frame.setVisible(true);
    }

    private final class MyThread implements Runnable { // 定义一个实现Runnable接口的类
        private final JProgressBar bar;
        int count = 0;

        private MyThread(JProgressBar bar) {
            this.bar = bar;
        }

        public void run() { // 重写run()方法
            while (true) {
                bar.setValue(count += 10); // 设置滚动条的值每次自增10
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("当前线程序被中断");
                }
            }
        }
    }

}

时间: 2024-10-11 22:55:13

第18章 多线程----线程的优先级的相关文章

第18章 多线程----线程同步

Java提供了线程同步的机制来防止资源访问的冲突. 1.线程安全 实际开发中,使用多线程程序的情况很多,如银行排号系统.火车站售票系统等.这种多线程的程序通常会发生问题. 以火车站售票系统为例,在代码中判断当前票数是否大于0,如果大于0则执行将该票出售给乘客功能,但当两个线程同时访问这段代码时(假如这时只剩下一张票),第一个线程将票售出,与此同时第二个线程也已经执行完成判断是否有票的操作,并得出结论票数大于0,于是它也执行售出操作,这样就会产生负数.所以在编写多线程程序时,应该考虑到线程安全问题

第18章 多线程----线程的生命周期

线程具有生命周期,其中包含7中状态,分别为:出生状态.就绪状态.运行状态.等待状态.休眠状态.阻塞状态.死忙状态. 1.线程的休眠 例如:在项目中创建SleepMethodTest类,该类继承了JFrame类,实现在窗体中自动画线段的功能,并且为线段设置颜色,颜色是随机产生的. import java.awt.*; import java.util.*; import javax.swing.*; public class SleepMethodTest extends JFrame { pri

JAVA-初步认识-第十三章-多线程(线程安全问题的现象)

一. 引言 接着看,把售票的问题给说完,这里涉及到一个小问题. 在我们进行线程任务封装,并进行线程对象创建的时候,我们发现确实通过四个线程能够将一百张票卖完.但是卖票的时候,会不会出现一些小问题呢?分析整个程序给大家展示一下. 现在有四个线程,都到了run方法中来运行.大家都知道,每个线程所属的栈区当中都有自己的run方法,比如它们同时在操作堆内存中的变量,叫做num. 假设这个num已经减到了1,这是个前提. 在num=1的情况下,四个线程Thread-0,Thread-1,Thread-2,

18、多线程 (线程安全、线程同步、等待唤醒机制、单例设计模式)

线程操作共享数据的安全问题 *A:线程操作共享数据的安全问题 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码. 程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 售票的案例 *A:售票的案例 /* - 多线程并发访问同一个数据资源 - 3个线程,对一个票资源,出售 */ public class ThreadDemo { public static void main(String[] args) { //创建Runnable接口实现

java 22 - 6 多线程之线程调度和设置线程的优先级

线程调度 假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令. 那么Java是如何对线程进行调用的呢? 线程有两种调度模型: 分时调度模型 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片 抢占式调度模型 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些. Java使用的是抢占式调度模型. 既然线程设有设置优先级,

JAVA中的多线程(八):线程的优先级和yield方法

优先级代表着抢资源的频率 所有线程默认优先级是5 yield()临时释放线程的执行权 1 class Demo implements Runnable 2 { 3 public void run() 4 { 5 for(int x = 0; x < 70; x++) 6 { 7 System.out.println(Thread.currentThread().toString()+"..."+x); 8 Thread.yield(); 9 } 10 } 11 } 12 13 c

“全栈2019”Java多线程第十三章:线程组ThreadGroup详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第十三章:线程组ThreadGroup详解 下一章 "全栈2019"Java多线程第十四章:线程与堆栈详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Ja

三、java多线程核心技术(笔记)——线程的优先级

概论: 在操作系统中,线程可以划分优先级,优先级高的获得的CPU资源较多,也就是CPU优先执行优先级较高的线程.在JAVA中线程的优先级 分1~~10个10个等级.大于或者小于会报异常. 一.线程优先级具有继承性 A 线程启动 B线程,则线程B的优先级与A的是一样的.. public class MyThread1 extends Thread { @Override public void run() { System.out.println("MyThread1 run priority=&

java多线程之线程的优先级

在操作系统中,线程可以划分优先级,优先级较高的线程得到CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务(其实并不是这样). 在java中,线程的优先级用setPriority()方法就行,线程的优先级分为1-10这10个等级,如果小于1或大于10,则抛出异常throw new IllegalArgumentException(),默认是5. public class MyThread1 extends Thread { @Override public void run() {