编写一多线程程序,实现如下功能:
(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(); } }