Java介绍多线程计算阶乘实现方法
代码运行结果如下:
输入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 /*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(); } } }
今天就到这里啦,我们下次见哦
到此这篇关于Java介绍多线程计算阶乘实现方法的文章就介绍到这了,更多相关Java多线程计算阶乘内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
spring mvc中注解@ModelAttribute的妙用分享
这篇文章主要给大家介绍了关于spring mvc中注解@ModelAttribute妙用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Android具有一定的参考学习价值,需要的朋友们下面来一起看看吧。2017-09-09mybatis 自定义实现拦截器插件Interceptor示例
这篇文章主要介绍了mybatis 自定义实现拦截器插件Interceptor,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-10-10
最新评论