练习多线程类的两种实现方法,理解多线程程序的生命周期

编写一多线程程序,实现如下功能:

(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();

    }
}


猜你喜欢

转载自blog.csdn.net/weixin_42103959/article/details/80460678