Written by Robert_Wang in Southwest University of Science And Technology.
编写一多线程程序,实现如下功能:
(1)一个线程进行阶乘和的运算(1!+2!+3!+……+12!),每次阶乘计算时间随机间隔0.5-1秒;
(2)另一个线程每隔1秒时间读取上个线程的运算结果和计算进程,并在图形界面中实时显示结果。
首先想到写三个类,功能分别是:显示、计算、传数据
显示:新建一个applicationwindow,建立一个包括计算过程、计算结果、进度条
还应该有一个开始执行的按钮。
计算:计算阶乘和,这里应该可以采用两个变量优化算法,具体看后面。
传数据:就是将计算的结果放入文本区域显示。
布局(Abusolutelayout) (就是容器、组件任意放)àJLabel (放标签) àJTextArea(文本区域)àJProgressBar(进度条)
计算:
计算的核心就是得到快速得到计算结果,这里我采用的用两个变量,一个将上一次的计算结果记住,一个累加。这样避免了每一次重复加。
传数据:传入计算和显示两个类,将计算结果传入显示的类的文本框,并设置是每隔1秒显示一次,还有进度条设置为计算的进度。

ThreadCompute:
package test6;
public class ThreadCompute extends Thread{
protected String textsum;
protected String textsum1;
protected static int i;
protected static int sum;
protected static int sum1;
public void method() {
i= sum = 1;
sum1=0;
while(i<=12)
{
//记录上次计算的结果
sum*=i;
//记录累加的结果
sum1+=sum;
textsum1 = String.valueOf(sum1);
if(i == 1) {
textsum = i + "!";
}
else textsum+="+"+i+"!";
i++;
//每个0.5 - 1.0 ms 计算一次
try {
this.sleep((long)(Math.random()*500+500));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void run() {
// TODO Auto-generated method stub
// super.run();
method();
}
}
ThreadRead:
package test6;
public class ThreadRead implements Runnable {
public ThreadCompute tc;
public ThreadFrame tf;
public ThreadRead(ThreadCompute tc, ThreadFrame tf) {
super();
this.tc = tc;
this.tf = tf;
}
public void show() {
while(true) {
tf.textField.setText(tc.textsum);
tf.textField_1.setText(tc.textsum1);
//每隔1秒显示一次
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tf.progressBar.setValue(tc.i);
}
}
@Override
public void run() {
// TODO Auto-generated method stub
show();
}
}
ThreadFrame:
package test6;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JProgressBar;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class ThreadFrame {
protected JFrame frame;
protected JTextField textField;
protected JTextField textField_1;
protected static ThreadFrame window;
protected JProgressBar progressBar;
protected int c=0;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
window = new ThreadFrame();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public ThreadFrame() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JLabel label = new JLabel("\u8BA1\u7B97\u8FC7\u7A0B");
label.setBounds(14, 26, 72, 18);
frame.getContentPane().add(label);
textField = new JTextField();
textField.setEditable(false);
textField.setBounds(100, 23, 260, 24);
frame.getContentPane().add(textField);
textField.setColumns(10);
JButton button = new JButton("\u5F00\u59CB\u6267\u884C");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
c++;
if(c ==1 ) {
ThreadCompute tc = new ThreadCompute();
//这个类只是实现了一个接口,
ThreadRead tr = new ThreadRead(tc, window);
Thread t = new Thread(tr);
tc.start();
t.start();
}
}
});
button.setBounds(151, 188, 113, 27);
frame.getContentPane().add(button);
progressBar = new JProgressBar();
progressBar.setBounds(100, 143, 260, 32);
progressBar.setMaximum(12);
frame.getContentPane().add(progressBar);
JLabel label_1 = new JLabel("\u8BA1\u7B97\u7ED3\u679C");
label_1.setBounds(14, 87, 72, 18);
frame.getContentPane().add(label_1);
textField_1 = new JTextField();
textField_1.setEditable(false);
textField_1.setBounds(100, 84, 260, 24);
frame.getContentPane().add(textField_1);
textField_1.setColumns(10);
}
}