编写一多线程程序,实现如下功能:
(1)一个线程进行阶乘和的运算(1!+2!+3!... ... +30!), 每次阶乘计算时间随机间隔0.5-1秒;
(2)另一个线程每隔1秒时间读取上个线程的运算结果和计算 进程,并在图形界面中实时显示结果。
public class thread extends Thread{
private String sum ="1" ;
private String result = "0";
private String Result = "";
public String getresult()
{
return result;
}
public String getResult() {
return Result;
}
@Override
public void run() {
for(int i=1;i<=30;i++) {
sum = "1";
for (int j = 1; j <= i; j++) {
BigInteger interger = new BigInteger(sum);
sum = interger.multiply(BigInteger.valueOf(j)).toString();
}
BigInteger interger = new BigInteger(sum);
BigInteger interger1 = new BigInteger(result);
result = interger.add(interger1).toString();
if(i!=1)
{
Result = Result + "+"+i+"!";
}else{
Result = i+"!";
}
double time = 0.5 + Math.random() * 0.5;
try {
Thread.sleep((long) (time * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
主窗口类
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ThreadFrame implements ActionListener{
JFrame jframe;//创建窗体
Panel panel;//创建面板
Label label_title;//创建标签
Label label_1;
Label label_2;
TextField textFile;//创建文本框
TextArea textArea;//创建文本域
Button btn;//创建按钮
public ThreadFrame(){
jframe=new JFrame("线程");//设置窗体名称
jframe.setResizable(false);
jframe.setBounds(600, 100, 490, 400);//设置大小
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//结束进程
panel=new Panel();
panel.setBackground(Color.white);//设置背景颜色
panel.setLayout(null);//取消默认布局
jframe.add(panel);
label_title=new Label("多线程实验");
label_1=new Label("计算线程:");
label_2 = new Label("计算结果");
label_1.setBounds(30, 100, 80, 20);
label_2.setBounds(30, 200, 80, 20);
panel.add(label_title);
panel.add(label_1);
panel.add(label_2);
textArea=new TextArea();
textArea.setBounds(130, 80, 300, 60);
textArea.setEditable(false);//不可编辑
panel.add(textArea);
textFile=new TextField("0");
textFile.setBounds(textArea.getX(), 220, textArea.size().width, 20);
textFile.setEditable(false);//不可编辑
panel.add(textFile);
btn=new Button("开始计算");
btn.setBounds(jframe.size().width/2-35, 270, 90, 30);
panel.add(btn);
btn.addActionListener(this);//添加监听器
jframe.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
thread ct=new thread();
Thread tc=new Thread(ct);
ReadTread rt=new ReadTread(this,ct);
Thread tr=new Thread(rt);
tc.start();
tr.start();
}
}
读取阶乘结果的类
public class ReadTread extends Thread {
ThreadFrame tf;
thread th;
public ReadTread(ThreadFrame tf,thread th)
{
this.tf = tf;
this.th = th;
}
@Override
public void run() {
while(true){
tf.textArea.setText(th.getResult());//将阶乘和的过程显示到文本域中
tf.textFile.setText(th.getresult());//将阶乘和结果显示到文本框中
try{
Thread.sleep(100);//0.1秒读取一次线程
}catch (Exception e) {
}
}
}
}
主类
public class testThread {
public static void main(String[] args) {
ThreadFrame frame = new ThreadFrame();
}
}