实验目的
练习多线程类的两种实现方法,理解多线程程序的生命周期。
实验内容
编写一多线程程序,实现如下功能:
(1)一个线程进行阶乘和的运算(1!+2!+3!……+30!),
每次阶乘计算时间随机间隔0.5-1秒;
(2)另一个线程每隔1秒时间读取上个线程的运算结果和计算
进程,并在图形界面中实时显示结果。
要求
1.分别采用Thread类和Runnable接口两种方式完成线程的设计
2.正确显示运行结果和计算进程的图形用户界面
这里我的两个线程均没有写异常处理机制,可自行添加
JAVA代码
package javaproject;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ThreadFrame implements ActionListener
{
JFrame jframe;
Container container;
JPanel jpanel1,jpanel2,jpanel3,jpanel4,jpanel5;//五个面板
Label title;Label l1;Label l2;Label l3;
JTextField j1;
JTextField j2;
JButton jButton;
JProgressBar jProgressBar;
/***初始化***/
public ThreadFrame()
{
jframe=new JFrame("多线程实验");
jframe.setBounds(400, 100, 400, 250);
jframe.setResizable(false);
container=jframe.getContentPane();
jframe.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we){
System.exit(0);}
});
/**组件初始化****/
jProgressBar=new JProgressBar(0,30);jProgressBar.setPreferredSize(new Dimension(280,20));
j1=new JTextField(25);j2=new JTextField(25);
jpanel1=new JPanel();jpanel2=new JPanel();jpanel3=new JPanel();jpanel4=new JPanel();jpanel5=new JPanel();
jButton=new JButton("开始计算");
title=new Label("多线程实验");
Font font = new Font("仿宋", Font.PLAIN, 30);title.setFont(font);title.setForeground(Color.blue);
l1=new Label("计算线程");l2=new Label("读取线程");l3=new Label("计算进度");
/***添加组件到容器***/
container.setLayout(new GridLayout(5,1));
jpanel1.add(title);jframe.add(jpanel1);
jpanel2.add(l1); jpanel2.add(j1); jframe.add(jpanel2);
jpanel3.add(l2); jpanel3.add(j2); jframe.add(jpanel3);
jpanel5.add(jButton);
jpanel4.add(l3); jpanel4.add(jProgressBar);jframe.add(jpanel4);jframe.add(jpanel5);
jframe.setVisible(true);
/****加入监听事件并注册监听器****/
jButton.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
/**Runnable接口**/
ComputeThread x=new ComputeThread(this);
Thread x1=new Thread(x);
x1.start();
/**Thread类扩展**/
ReturnThread x2=new ReturnThread(this);
x2.start();
}
}
class ComputeThread implements Runnable{//一个线程进行阶乘和的运算
ThreadFrame threadframe;
public ComputeThread(ThreadFrame threadframe)
{
this.threadframe=threadframe;
}
static double sum1=0;//阶乘和
static int i;//进度
static String sum="";//阶乘和1!+2!+3!+....+30!字符串
static String Result="";//阶乘结果字符串
double jiecheng(int m)//阶乘计算函数
{
double result=1;
for(int i=1;i<=m;i++)
{
result*=i;
}
return result;
}
public void run()
{
for(i=1;i<=30;i++)
{
/**阶乘和显示***/
if(sum.equals(""))
{
sum=i+"!";
}
else
{
sum+="+"+i+"!";
}
sum1+=jiecheng(i);
Result=String.valueOf(sum1);
/*threadframe.j2.setText(Result);
threadframe.j1.setText(sum);
threadframe.jProgressBar.setValue(i);*/
//异常处理
try{
Thread.sleep((long)(500 + 500 * Math.random()));
}catch (InterruptedException e) {}
}
}
}
class ReturnThread extends Thread//一个线程每隔1秒时间读取上个线程的运算结果和计算进程,并在图形界面中实时显示结果
{
ThreadFrame threadFrame;
public ReturnThread(ThreadFrame threadFrame)
{
this.threadFrame=threadFrame;
}
public void run()
{
while(ComputeThread.i<=30)
{
threadFrame.jProgressBar.setValue(ComputeThread.i);//进度条显示进度
threadFrame.j2.setText(ComputeThread.Result);//显示阶乘计算结果
threadFrame.j1.setText(ComputeThread.sum);//显示各个阶乘计算和
try{
Thread.sleep(100);
}catch (InterruptedException e){
}
}
ComputeThread.sum1=0;//计算阶乘的结果 Reuslt将sum1转化为字符串
ComputeThread.sum="";//显示1!+2!+····+30!的阶乘
ComputeThread.i=1;//进度条
threadFrame.jButton.setText("重新计算");//计算完设置重新计算按钮
}
}
/***主main类***/
public class xiancheng
{
public static void main(String args[])
{
ThreadFrame t=new ThreadFrame();
}
}