Java介绍多线程计算阶乘实现方法

网友投稿 314 2022-07-22


代码运行结果如下:

输入n的值之后,就可以点击开始计算,计算过程中可以暂停计算,也可以停止计算

这是几种线程的操作:

1.sleep方法,线程按时间睡眠,到时间恢复。

2.suspend/resume,暂停/继续方法。java多线程废弃方法。资源独占,容易发生死锁,脏数据。

3.stop,停止方法,Java多线程废弃方法,线程不安全。

4.wait方法http://,使得当前线程立刻停止运行,处于等待状态(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("停止计算");

beFOEHlqc 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) http://-> {

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.http://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 /*implements Runnable*/{

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();

}

}

}

今天就到这里啦,我们下次见哦


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java完整实现记事本代码
下一篇:Springboot详细讲解循环依赖
相关文章

 发表评论

暂时没有评论,来抢沙发吧~