一、实验目的
1、练习多线程类的两种实现方法,理解多线程程序的生命周期。
二、实验内容
编写一多线程程序,实现如下功能:
(1)一个线程进行阶乘和的运算(1!+2!+3!……+30!), 每次阶乘计算时间随机间隔0.5-1秒;
(2)另一个线程每隔1秒时间读取上个线程的运算结果和计算 进程,并在图形界面中实时显示结果。
三、实验要求
1、正确设计显示运行结果和计算进程的图形用户界面;
2、分别采用Thread类的子类和Runnable接口两种方式完成两个 线程的设计;
3、进行全面的测试并分析测试结果;
4、简要说明你在该实验中的收获与体会
四、实验设计
1、设计三个类ComputeThread、ReturnThread和ThreadFrame,分别实现计算进程,返回结果进程和界面设计。
ThreadFrame类代码实现
public class ThreadFrame implements ActionListener{
JFrame frame;
JPanel panel1,panel2,panel3,panel4,panel5;
Container container;
JTextField output,resultfield;
JButton button;
JLabel label1,label2,label3,label4;
JProgressBar jprogressBar;
public ThreadFrame(){
frame = new JFrame("多线程实验界面");
frame.setBounds(400, 100, 730, 500);
container=frame.getContentPane();
frame.setResizable(false);
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e) {
System.exit(1);
}
});
label1 = new JLabel("多线程实验");
label1.setForeground(Color.red);
label1.setFont(new Font("Dialog",1,50));
label2 = new JLabel("计算线程");
label2.setFont(new Font("Dialog",1,30));
label3 = new JLabel("运算结果");
label3.setFont(new Font("Dialog",1,30));
label4 = new JLabel("计算进度");
label4.setFont(new Font("Dialog",1,30));
output = new JTextField();
output.setPreferredSize(new Dimension(550,40));
output.setFont(new Font("Dialog",1,20));
resultfield = new JTextField();
resultfield.setFont(new Font("Dialog",1,20));
resultfield.setPreferredSize(new Dimension(550,40));
panel1 = new JPanel();
panel2 = new JPanel();
panel3 = new JPanel();
panel4 = new JPanel();
panel5 = new JPanel();
button = new JButton("开始计算");
button.setFont(new Font("Dialog",1,30));
button.setPreferredSize(new Dimension(200,60));
button.addActionListener(this);
jprogressBar = new JProgressBar(0,30);
jprogressBar.setPreferredSize(new Dimension(550,20));
panel1.add(label1);
panel2.add(label2);
panel2.add(output);
panel3.add(label3);
panel3.add(resultfield);
panel4.add(label4);
panel4.add(jprogressBar);
panel5.add(button);
container.setLayout(new GridLayout(5,1));
container.add(panel1);
container.add(panel2);
container.add(panel3);
container.add(panel4);
container.add(panel5);
frame.show();
}
//开始计算监听器
public void actionPerformed(ActionEvent e)
{
ComputeThread computethread = new ComputeThread(this);
Thread thread1 = new Thread (computethread);//实现runnable接口建立线程
ReturnThread thread2 = new ReturnThread(this);//继承Thread类建立线程
thread1.start();//启动线程
thread2.start();//启动线程
}
public static void main(String[] args)
{
ThreadFrame test = new ThreadFrame();
}
}
ComputeThread类实现
public class ComputeThread implements Runnable{
ThreadFrame threadframe ;
static public double result = 0;
static public int i;
String str1 = "";
public ComputeThread(ThreadFrame t) {
threadframe = t;
}
public void run() {
long s=1;
for(i=1;i<=30;i++)
{
if(str1.equals(""))
{
str1=i+"!";
}
else
{
str1 += "+" + i + "!";
}
s *=i;
result +=s;
threadframe.output.setText(str1);
threadframe.jprogressBar.setValue(i);
try {
Thread.sleep((long)(500 + 500 * Math.random()));
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("第1个线程休眠时出错!");
}
}
}
}
ReturnThread类实现
public class ReturnThread extends Thread{
ThreadFrame threadFrame;
public ReturnThread(ThreadFrame threadFrame){
this.threadFrame = threadFrame;
}
public void run() {
while(ComputeThread.i != 30){
threadFrame.resultfield.setText("" + ComputeThread.result);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("第2个线程休眠时出错!");
}
}
//这之后的代码确保显示的结果已经是最终结果
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("第2个线程在最后一次休眠时出错!");
}
threadFrame.resultfield.setText("" + ComputeThread.result);
ComputeThread.result = 0;//初始化结果
ComputeThread.i = 1;//初始化i值
threadFrame.button.setText("重新计算");//重设按钮文字
}
}