Java-计算10的阶乘并显示在界面

需求分析

利用线程计算10!并随机间隔一段时间输出到TextArea
在这里插入图片描述

代码实现

ThreadFrame

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ThreadFrame {
	
//	private JTextField inputField;
	private JTextArea consoleArea;
	private CalculateAlg calAlg ;
	public  ThreadFrame() {
		JFrame frame=new JFrame("阶乘和计算");//新建窗体类
		frame.setSize(500,500);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(new BorderLayout());
		frame.setLocationRelativeTo(null);//窗体居中显示
		JPanel panel=new JPanel();
		frame.add(panel,BorderLayout.NORTH);
		panel.setLayout(new FlowLayout());
//		panel.add(new JLabel("输入N:"));
//		inputField=new JTextField(20);
//		panel.add(inputField);
		JButton startBtn=new JButton("开始计算");
		
		panel.add(startBtn);
		startBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				calAlg =new CalculateAlg(10,consoleArea);
				calAlg.start();
			}
		});
		consoleArea=new JTextArea();
		JScrollPane scroll=new JScrollPane(consoleArea);//添加滚动条
		frame.add(scroll,BorderLayout.CENTER);
		frame.setVisible(true);
	} 
	public static void main(String[] args) {
		new ThreadFrame();
	}
}

CalculateAlg

import java.math.BigInteger;
import javax.swing.JTextArea;
//通过继承Thread来启动线程
public class CalculateAlg extends Thread {
	private int n;
	private StringBuilder sb;
	//StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。
	private JTextArea consoleArea;
	private boolean pause=false;
	public CalculateAlg(int n,JTextArea consoleArea) {
		this.n = n;
		this.consoleArea = consoleArea;
	}
	public void calculate() {
		pause=false;
		sb=new StringBuilder();
		BigInteger ni=BigInteger.valueOf(1); //BigDecimal 大数运算
		BigInteger sum=BigInteger.valueOf(0);
		
		System.out.println(n);
		for(int i=1;i<=n;i++) {
			synchronized (this) {
				if(pause) {
					try {
						wait();
					} catch ( InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
			ni=ni.multiply(BigInteger.valueOf(i));
			sum=sum.add(ni);
			sb.append(i==1?"":"+");
			sb.append(i+"!");
			log(sb.toString()+"="+sum);//打印运算表达式
			
			try {
			//Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值
				Thread.sleep((long) ((0.5+Math.random()/2)*1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	private void log(String msg) {
		consoleArea.append(msg+"\n");
	}
	public void run() {
		calculate();
	}
}

实验总结

  1. 巩固布局相关知识
  2. Java线程知识理解和运用

参考文档

Thread详解

JFrame,JPanel,JLabel详解

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值