需求分析
利用线程计算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();
}
}
实验总结
- 巩固布局相关知识
- Java线程知识理解和运用