代码运行结果如下:
输入n的值之后,就可以点击开始计算,计算过程中可以暂停计算,也可以停止计算
这是几种线程的操作:
1.sleep方法,线程按时间睡眠,到时间恢复。
2.suspend/resume,暂停/继续方法。Java多线程废弃方法。资源独占,容易发生死锁,脏数据。
3.stop,停止方法,Java多线程废弃方法,线程不安全。
4.wait方法,使得当前线程立刻停止运行,处于等待状态(WAIT),并将当前线程置入锁对象的等待队列中,直到被通知(notify)或被中断为止。
5.notify方法,唤醒处于等待状态的线程
代码如下:
import java.awt.BorderLayout;
import java.awt.ScrollPane;
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.Scrollable;
import alg.Calculate;
public class ThreadUI {
private JTextField textField;
private JTextArea consoleArea;
private Calculate cal;
private Thread thread;
public ThreadUI() {
JFrame frame = new JFrame("阶乘计算所用时间统计");
frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 北侧,加操作栏
frame.setLayout(new BorderLayout());
JPanel northPan = new JPanel();
JLabel label = new JLabel("请输入n的值:");
textField = new JTextField(5);
JButton stratBtn = new JButton("开始计算");
stratAction(stratBtn);
JButton pauseBtn = new JButton("暂停计算");
pauseAction(pauseBtn);
JButton stopBtn = new JButton("停止计算");
stopAction(stopBtn);
northPan.add(label);
northPan.add(textField);
northPan.add(stratBtn);
northPan.add(pauseBtn);
northPan.add(stopBtn);
frame.add(northPan, BorderLayout.NORTH);
// 中间,记录计算过程与结果
consoleArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(consoleArea);
frame.add(scrollPane, BorderLayout.CENTER);
frame.setVisible(true);
}
// 停止计算的事件
private void stopAction(JButton stopBtn) {
stopBtn.addActionListener((e) -> {
cal.stop();
//thread.stop();
});
}
// 暂停计算的事件
private void pauseAction(JButton pauseBtn) {
pauseBtn.addActionListener((e) -> {
String pauseText = pauseBtn.getText();
if (pauseText.equals("暂停计算")) {
cal.suspend();
//thread.suspend();
pauseBtn.setText("继续计算");
} else {
cal.resume();
//thread.resume();
pauseBtn.setText("暂停计算");
}
});
}
// 开始计算的事件
private void stratAction(JButton button) {
button.addActionListener((e) -> {
consoleArea.setText(null);
String input = textField.getText();
if(input==null || input.equals(""))
{
consoleArea.setText("请先输入您要计算的阶乘值");
return;
}
int n = Integer.valueOf(input);
cal = new Calculate(n, (content) -> {
consoleArea.append(content + "\n");
});
// thread = new Thread(cal);
// thread.start();
cal.start();
});
}
public static void main(String[] args) {
new ThreadUI();
}
}
import java.math.BigInteger;
import ui.Logable;
public class Calculate extends Thread {
private int n;
private Logable logable;
public Calculate(int n,Logable log) {
this.n=n;
this.logable=log;
}
private void caculate() throws InterruptedException {
BigInteger res=BigInteger.valueOf(1);
BigInteger sum=BigInteger.valueOf(0);
StringBuilder sb = new StringBuilder();
for(int i=1;i<=n;i++) {
res=res.multiply(BigInteger.valueOf(i));
sum=sum.add(res);
sb.append((i==1 ? "":"+")+i+"!");
logable.log(sb.toString()+"="+sum);
try {
Thread.sleep((int)(Math.random()*500+500));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
try {
caculate();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
今天就到这里啦,我们下次见哦
到此这篇关于Java介绍多线程计算阶乘实现方法的文章就介绍到这了,更多相关Java多线程计算阶乘内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!