Java多线程计算阶乘
工藤学编程 人气:0代码运行结果如下:
输入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(); } } }
今天就到这里啦,我们下次见哦
加载全部内容