JAVA多线程程序ProgressBar

题目简介:

思维导图:

实验代码:建议先看CalThread类,计算线程的实现,再作基本CalFrame类的界面,

然后作ReadThread类,结合CalFrame的组件,最后完善CalFrame类

(代码折叠)

  1. import java.awt.EventQueue;
  2.  
  3. import javax.swing.JFrame;
  4. import java.awt.BorderLayout;
  5. import javax.swing.JLabel;
  6. import java.awt.Font;
  7. import javax.swing.SwingConstants;
  8. import javax.swing.JPanel;
  9. import java.awt.GridLayout;
  10. import javax.swing.JTextArea;
  11. import javax.swing.JProgressBar;
  12. import javax.swing.border.EmptyBorder;
  13. import javax.swing.JButton;
  14. import java.awt.event.ActionListener;
  15. import java.awt.event.ActionEvent;
  16. /**
  17. *@author 李祖林
  18. */
  19. public class CalFrame implements ActionListener{
  20.  
  21. private JFrame frame;
  22. JTextArea textA,textB;
  23. JProgressBar progressBar;
  24.  
  25. JButton button;
  26.  
  27. public CalFrame() {
  28.  
  29. frame = new JFrame();
  30. frame.setBounds(100, 100, 755, 300);
  31. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  32. frame.getContentPane().setLayout(new BorderLayout(0, 0));
  33.  
  34. JLabel label = new JLabel("\u591A\u7EBF\u7A0B \u8BA1\u7B971!+2!+...+12!");
  35. label.setHorizontalAlignment(SwingConstants.CENTER);
  36. label.setFont(new Font("宋体", Font.BOLD, 18));
  37. frame.getContentPane().add(label, BorderLayout.NORTH);
  38.  
  39. JPanel panel = new JPanel();
  40. frame.getContentPane().add(panel, BorderLayout.CENTER);
  41. panel.setLayout(new GridLayout(3, 2, 0, 0));
  42.  
  43. JLabel label_1 = new JLabel("\u8BA1\u7B97\u8FC7\u7A0B");
  44. label_1.setFont(new Font("宋体", Font.BOLD, 18));
  45. label_1.setHorizontalAlignment(SwingConstants.CENTER);
  46. panel.add(label_1);
  47.  
  48. textA = new JTextArea();
  49. textA.setFont(new Font("Courier New", Font.BOLD, 15));
  50. panel.add(textA);
  51.  
  52. JLabel label_2 = new JLabel("\u8FDB\u5EA6\u6761");
  53. label_2.setHorizontalAlignment(SwingConstants.CENTER);
  54. label_2.setFont(new Font("宋体", Font.BOLD, 18));
  55. panel.add(label_2);
  56.  
  57. progressBar = new JProgressBar();
  58. progressBar.setMaximum(12);
  59. panel.add(progressBar);
  60.  
  61. JLabel label_3 = new JLabel("\u8BA1\u7B97\u7ED3\u679C");
  62. label_3.setHorizontalAlignment(SwingConstants.CENTER);
  63. label_3.setFont(new Font("宋体", Font.BOLD, 18));
  64. panel.add(label_3);
  65.  
  66. textB = new JTextArea();
  67. textB.setFont(new Font("Courier New", Font.BOLD, 18));
  68. panel.add(textB);
  69.  
  70. JPanel panel_1 = new JPanel();
  71. frame.getContentPane().add(panel_1, BorderLayout.SOUTH);
  72.  
  73. button = new JButton("\u5F00\u59CB");
  74. button.setFont(new Font("宋体", Font.BOLD, 18));
  75. panel_1.add(button);button.addActionListener(this);
  76.  
  77. frame.setVisible(true);
  78. }
  79.  
  80. public void actionPerformed(ActionEvent e) {
  81. /*计算线程 自启动*/
  82. CalThread calThread = new CalThread();
  83.  
  84. /*读取线程*/
  85. ReadThread readThread = new ReadThread(this); //此处的this是CalFrame类的对象
  86. Thread thread = new Thread(readThread); //非自启动:构造扩展线程类的对象,通过Thread()传该类得以实现线程
  87. thread.start();
  88. }
  89.  
  90. public static void main(String[] args) {
  91. CalFrame calFrame = new CalFrame();
  92. }
  93.  
  94. }

CalFrame

  1. /**
  2. * @author 李祖林
  3. *
  4. */
  5. public class ReadThread extends Thread {
  6. /*成员变量*/
  7. CalFrame calFrame;
  8.  
  9. /*(有参与无参)构造函数*/
  10. public ReadThread() {}
  11. public ReadThread(CalFrame calFrame) {
  12. this.calFrame = calFrame;
  13. }
  14.  
  15. /*线程开始读取*/
  16. public void run(){
  17. while(true){
  18. calFrame.textA.setText(CalThread.string); //计算过程
  19. calFrame.textB.setText(String.valueOf(CalThread.sum)); //计算结果
  20. calFrame.progressBar.setValue(CalThread.n); //计算进度
  21. try {
  22. Thread.sleep(100);
  23. } catch (InterruptedException e) {
  24. System.err.println("读取线程ReadThread发送错误!");
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. }

ReadThread

  1. /**
  2. * @author 李祖林
  3. *
  4. */
  5. public class CalThread extends Thread {
  6. static double sum = 1;
  7. static String string = "1!";
  8. static int n = 1;
  9. Thread thread = null;
  10.  
  11. /*构造函数 自启动*/
  12. public CalThread() {
  13. thread = new Thread(this);
  14. thread.start();
  15. }
  16.  
  17. /*计算n!*/
  18. double fun(int n){
  19. double sum = 1;
  20. for(int i = 1;i <= n;i++){
  21. sum *= i;
  22. }
  23. return sum;
  24. }
  25. /*线程开始计算*/
  26. public void run(){
  27. while(n<12){
  28. n++; //进度条进度
  29. sum += fun(n); //计算结果
  30. string = string + "+" + n + "!"; //计算过程
  31. try {
  32. Thread.sleep((int)Math.random()*600 + 300); //随机300-900毫秒
  33. } catch (InterruptedException e) {
  34. System.err.println("计算线程CalThread出现错误!");
  35. e.printStackTrace();
  36. }
  37. }
  38. }
  39.  
  40. }

CalThread

实验结果:

JAVA多线程程序ProgressBar的更多相关文章

  1. JAVA多线程程序ProgressBar2

    JAVA多线程程序ProgressBar2 题目简介: 思路分析:与上一篇:JAVA多线程程序ProgressBar类似,本篇避免过于冗杂,所以在此没有给出. 实验代码: import java.aw ...

  2. Java多线程程序休眠、暂停与停止

    休眠   在Java多线程中,可以使用sleep()方法在指定毫秒数内让当前正在执行的线程休眠.   下面这段代码,使得主函数的main线程休眠了2000ms,最后输出的间隔时间也是2000ms. p ...

  3. Java多线程-程序运行堆栈分析

    class文件内容 class文件包含JAVA程序执行的字节码:数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符:文件开头有一个0xcafebabe(16进制)特殊的一个标志. ...

  4. (转载)Java多线程的监控分析工具(VisualVM)

    原文链接:http://blog.csdn.net/chendc201/article/details/22905511 在Java多线程程序运行时,多数情况下我们不知道到底发生了什么,只有出了错误的 ...

  5. [转载] java多线程学习-java.util.concurrent详解(一) Latch/Barrier

    转载自http://janeky.iteye.com/blog/769965     Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可 ...

  6. Java多线程异常处理

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉.这一点是通过java.lang.Run ...

  7. 【java多线程系列】java内存模型与指令重排序

    在多线程编程中,需要处理两个最核心的问题,线程之间如何通信及线程之间如何同步,线程之间通信指的是线程之间通过何种机制交换信息,同步指的是如何控制不同线程之间操作发生的相对顺序.很多读者可能会说这还不简 ...

  8. Java多线程概念简介 多线程中篇(一)

    Java的线程与操作系统的线程   在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...

  9. 关于java多线程中异常捕获的理解

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

随机推荐

  1. 使用remix的solidity在线编译环境部署一个faucet合约

    一.浏览器打开https://remix.ethereum.org 地址 点击"+"新建一个sol文件,命名为faucet.sol 然后在代码区输入solidity代码 选择相关插 ...

  2. Hdu 1564 1*2矩阵覆盖棋局博弈

    n*n的矩阵如果n为偶数 则可被1*2的矩形完全覆盖 如果n为奇数 则除起点外 其他各自可被1*2矩形完全覆盖 所以当n为偶数 先手赢 n为奇数 后手赢 #include<bits/stdc++ ...

  3. 接口数据转json格式

    接口数据转json格式 function tojson($result, $callback = null){ header('Content-Type:text/html; charset=utf- ...

  4. usb发送字节

  5. 安装及创建python虚拟环境

    有点气,是真的有点气,以为安装错误了,没想到是命令问题 参考链接: https://cloud.tencent.com/developer/article/1176291 https://www.cn ...

  6. solr 倒排索引(转载)

    原文地址:http://blog.csdn.net/chichengit/article/details/9235157 http://blog.csdn.net/njpjsoftdev/articl ...

  7. 什么是JWT?Token与Session的区别?

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  8. TXNLP 33-40

    词向量: 回顾基于检索的问答系统 倒排表解决:坑爹的翻译...应该翻译成“反向索引” 常规的索引是文档到关键词的映射: 文档——>关键词但是这样检索关键词的时候很费力,要一个文档一个文档的遍历一 ...

  9. confirm 弹出信息

    if(confirm("真的要删除吗?")){ alert("点击了确认按钮"); } else{ alert("点击了取消按钮"); } ...

  10. 13. Ajax技术

    在传统的Web应用模式中,页面中用户的每一次操作都将触发一次返回Web服务器的HTTP请求,服务器进行相应的处理后,返回一个HTML页面的客户端.而在Ajax应用中,页面中的用户的操作将通过Ajax引 ...