💕💕💕大家好,这是作业侠系列之Java实现多线程计算阶乘和,还是那句话,大家不想cv或者cv了跑不起来都可以来找我要源码。有任何问题有可以私聊我,大家觉得还行的话,期待你们的三连,这也是我创作的最大动力💕💕💕
往期源码回顾: 【Java】实现绘图板(完整版) 【C++】图书管理系统(完整板) 【Java】实现计算器(完整版) 【Python】实现爬虫,爬取天气情况并进行分析(完整版) 【Java】实现记事本(完整版)
上述源码我的大家有需要可自取,大家不想cv或者cv了跑不起来都可以来找我要源码。
进入主题:
代码运行结果如下: 输入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();
});
}
private void pauseAction(JButton pauseBtn) {
pauseBtn.addActionListener((e) -> {
String pauseText = pauseBtn.getText();
if (pauseText.equals("暂停计算")) {
cal.suspend();
pauseBtn.setText("继续计算");
} else {
cal.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");
});
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();
}
}
}
今天就到这里啦,我们下次见哦!!
|