Java 虚拟机在调度各线程运行时,并非每个线程的运行机会相同,调度机制根据各线程的优先级调度各线程。因而,优先级高的线程获得的运行时间就多,优先级低的线程获得的运行时间就少。本例演示了不同优先级的线程在完成同一个任务时的不同进度,来验证上面的结论。高优先级的线程获得运行的机会多。同时开始的两个不同优先级的线程,在做同一个任务时的不同进度如图所示:

实现思路:Java 的线程类java.lang.Thread 提供了三个级别的线程优先级,即Thread.MIN_PRIORITY、Thread.NORM_PRIORITY 和Thread.MAX_PRIORITY 。并且提供了设置线程优先级的方法setPriority(int priority)。本例中,当程序运行时,两个优先级分别为Thread.MIN_PRIORITY 和Thread.MAX_PRIORITY的线程,分别使各自的进度条值增加。为此,编写一个继承Thread 类的ProgressThread 来完成计算并刷新显示进度条值的功能。程序代码:1.新建一个Project,取名为JThreadRace。2. 新建一个Application, 取名为JThreadRace ; 主窗口取名为MainFrame, 标题为JThreadRace。3.在MainFrame 类的设计窗口中添加两个JProgressBar 组件、一个JButton 组件和一个JLabel组件;并在类中添加新的属性ProgressThread pThread1 和ProgressThread pThread2,具体代码如下:public class MainFrame extends JFrame {

private JPanel contentPane;

private BorderLayout borderLayout1 = new BorderLayout();

//实例化组件

private JLabel jLabel1 = new JLabel();

private JProgressBar jProgressBar1 = new JProgressBar();

private JProgressBar jProgressBar2 = new JProgressBar();

private JButton jButton1 = new JButton();

//申明两个线程类的对象

private ProgressThread pThread1=null;

private ProgressThread pThread2=null;

……

}

4.编写MainFrame 类的初始化方法jbInit()。private void jbInit() throws Exception {

//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Your Icon]")));

contentPane = (JPanel) this.getContentPane();

//设置组件属性

jLabel1.setFont(new java.awt.Font("Dialog", 0, 14));

jLabel1.setToolTipText("");

jLabel1.setHorizontalAlignment(SwingConstants.CENTER);

jLabel1.setText("线程赛马演示(右边的高优先级、左边的低优先级)");

contentPane.setLayout(borderLayout1);

this.setSize(new Dimension(333, 222));

this.setTitle("JThreadRace");

jProgressBar1.setOrientation(JProgressBar.VERTICAL);

jProgressBar1.setFont(new java.awt.Font("Dialog", 0, 14));

jProgressBar1.setMaximumSize(new Dimension(84, 32767));

jProgressBar1.setPreferredSize(new Dimension(120, 148));

jProgressBar1.setStringPainted(true);

jProgressBar2.setOrientation(JProgressBar.VERTICAL);

jProgressBar2.setFont(new java.awt.Font("Dialog", 0, 14));

jProgressBar2.setPreferredSize(new Dimension(120, 148));

jProgressBar2.setStringPainted(true);

jButton1.setFont(new java.awt.Font("Dialog", 0, 14));

jButton1.setToolTipText("");

jButton1.setText("Start");

jButton1.addActionListener(new java.awt.event.ActionListener() {//添加按钮的事件监听器

public void actionPerformed(ActionEvent e) {

jButton1_actionPerformed(e);

}

});

contentPane.add(jLabel1, BorderLayout.NORTH);

contentPane.add(jProgressBar1, BorderLayout.WEST);

contentPane.add(jProgressBar2, BorderLayout.EAST);

contentPane.add(jButton1, BorderLayout.SOUTH);

}

5.处理按钮的事件方法,创建两个不同优先级的比赛线程并开始运行。void jButton1_actionPerformed(ActionEvent e) {

if(((JButton)e.getSource()).getText().equals("Start")){

//当单击时按钮文字是“Start“,则单击后设为”Stop“,并且创建两个ProgressThread 的实例,但两个

//线程的优先级不同,然后运行线程

this.jButton1.setText("Stop");

pThread1=new ProgressThread(this.jProgressBar1,Thread.MAX_PRIORITY);

pThread1.start();

ProgressThread pThread2=new ProgressThread(this.jProgressBar2,Thread.MIN_PRIORITY);

pThread2.start();

//否则,停止两个线程

}else{

this.jButton1.setText("Start");

this.pThread1.stopped=true;

}

}

6.新建一个Class,取名为ProgressThread,继承java.lang.Thread 类。编写ProgressThread类,用来完成任务并将任务进度显示在JProgressBar 对象上,代码如下:public class ProgressThread extends Thread {

JProgressBar pbar;

static boolean stopped;

public ProgressThread(JProgressBar pbar,int priority) {

try{

this.pbar=pbar; //获得MainFrame 中JProgressBar 对象的引用

this.stopped=false;

this.setPriority(priority); //设置线程优先级

}catch(Exception err){

err.printStackTrace();

}

}

public void run() {

int min=0;

int max=1000;

//初始化进度条的属性设置

this.pbar.setMinimum(min);

this.pbar.setMaximum(max/10);

this.pbar.setValue(min);

//开始循环

for(int i=min; i<=max; i++){

if(stopped)

break;

else{

//在进度条上显示进度信息

this.pbar.setValue((int)(i/10));

this.pbar.setString(String.valueOf(i));

try{

Thread.sleep(10);//等待10ms,使得任务不至于还没看清就结束

}catch(Exception err){

err.printStackTrace();

}

}

}

}

}

多线程赛马程序Java_Java线程优先级示例-在各优先级线程间“赛马”相关推荐

  1. Java线程池示例:任务窃取线程池WorkStealingPool

  2. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

  3. java 线程栈 公享变量_Java线程:线程栈模型与线程的变量

    Java线程:线程栈模型与线程的变量 要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运行动 ...

  4. C# 线程手册 第五章 扩展多线程应用程序 系列

    [第1篇] 什么是线程池 到目前为止我们使用多线程应用程序的目的是尽可能多地使用计算机处理器资源.所以,看起来我们仅需要为每个独立的任务分配一个不同的线程,并让处理器确定在任何时间它总会处理其中的某一 ...

  5. PySide2多线程问题示例:创建新线程、子线程发射信号到主界面

    PySide2多线程问题示例:创建新线程.子线程发射信号到主界面 本文是在pyside学习过程中的记录,从无子线程.子线程在主程序中直接操作Qt界面.子线程发射信号操作主界面三个步骤出发,记录对多线程 ...

  6. 【多线程】线程的引入,创建线程的方式,设置线程名字、获取名字,线程优先级priority,加入休眠的方法,,后台线程,礼让线程,Join,中断线程,某电影院,共有100张票线程流程图,3售票窗口,

    多线程 1.线程的引入 进程: 正在运行的程序,是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和资源. 线程: 是进程的单个顺序控制流,或者说就是一个单独执行的路径 一个进程如果只 ...

  7. 多线程面试题_线程,代码和数据–多线程Java程序实际运行的方式

    多线程面试题 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后您才意识到,这是我最想念的那几年,这是非常基本的. 了解多线程Java程序的执行方式就是其中之一. 您肯定已经 ...

  8. 线程模型、pthread 系列函数 和 简单多线程服务器端程序

    一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 "线程实现"建立在&qu ...

  9. Java 多线程(三) 线程的生命周期及优先级

    Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: ...

最新文章

  1. 百般优势的腾讯搜搜为何最后还是死掉? 基层码农忆搜搜
  2. NHibernate 与Oracle 点滴
  3. 前端学习(417):京东制作页面25中间部分的准备工作
  4. 在javascript中关于局部变量和全局变量简析
  5. 高性能消息中间件——NATS
  6. C++友元函数简单示例
  7. As we all know, Java 8 provides many new features
  8. html改变微信标题栏颜色,带你了解微信在线编辑器的颜色样式修改
  9. matlab有限域多项式除法_MATLAB极小值优化
  10. CSS 实现文字头像(圆角头像文字内容)
  11. dsp c语言流水灯程序,DSP流水灯源程序
  12. python爬斗鱼直播房间名和主播名_谁才是斗鱼一哥?(用Python抓取斗鱼直播间信息)...
  13. 机器学习(十)——支持向量机
  14. 使用第三方广告服务器的好处
  15. 5600高流明更清晰 NEC CF6600U投影试用
  16. python网站攻击-利用Python进行Web渗透测试(十):密码攻击
  17. leetcode 1219. 黄金矿工
  18. 说说远程团队协作的故事
  19. 「深度」VR家装开局完美,但适度挤掉一点水分或许更利于它的发展
  20. 我的世界JAVA挂机杀怪有经验_5分钟教你打造mc最简单的刷经验机!挂机就能无限经验?...

热门文章

  1. 英语与计算机整合课,浅谈计算机与英语教学的有效整合
  2. 北京ios培训-如何选择好的iOS开发培训机构
  3. MOUSE WITHOUT BORDERS连接失败原因猜测
  4. 《画解数据结构》哈希表
  5. R2S软路由+夸克网盘实现本地追剧
  6. PL/SQL DEV 10版本设置工具栏显示大小写转换按键
  7. 众达说两化融合之程序文件之业务流程与组织架构优化
  8. 在Visual Studio中构建编译FFmpeg
  9. 【财务会计学习笔记】——财务的三大报表
  10. 红米手机android system,小米多款谷歌Android One手机曝光:全是红米系列