マルチスレッドタイプの2つの実装方法を練習し、マルチスレッドプログラムのライフサイクルを理解する。

4072 ワード

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

    }
}