Java介紹多線程計(jì)算階乘實(shí)現(xiàn)方法
代碼運(yùn)行結(jié)果如下:
輸入n的值之后,就可以點(diǎn)擊開始計(jì)算,計(jì)算過程中可以暫停計(jì)算,也可以停止計(jì)算
這是幾種線程的操作:
1.sleep方法,線程按時間睡眠,到時間恢復(fù)。
2.suspend/resume,暫停/繼續(xù)方法。Java多線程廢棄方法。資源獨(dú)占,容易發(fā)生死鎖,臟數(shù)據(jù)。
3.stop,停止方法,Java多線程廢棄方法,線程不安全。
4.wait方法,使得當(dāng)前線程立刻停止運(yùn)行,處于等待狀態(tài)(WAIT),并將當(dāng)前線程置入鎖對象的等待隊(duì)列中,直到被通知(notify)或被中斷為止。
5.notify方法,喚醒處于等待狀態(tài)的線程
代碼如下:
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("階乘計(jì)算所用時間統(tǒng)計(jì)"); frame.setSize(500, 500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 北側(cè),加操作欄 frame.setLayout(new BorderLayout()); JPanel northPan = new JPanel(); JLabel label = new JLabel("請輸入n的值:"); textField = new JTextField(5); JButton stratBtn = new JButton("開始計(jì)算"); stratAction(stratBtn); JButton pauseBtn = new JButton("暫停計(jì)算"); pauseAction(pauseBtn); JButton stopBtn = new JButton("停止計(jì)算"); stopAction(stopBtn); northPan.add(label); northPan.add(textField); northPan.add(stratBtn); northPan.add(pauseBtn); northPan.add(stopBtn); frame.add(northPan, BorderLayout.NORTH); // 中間,記錄計(jì)算過程與結(jié)果 consoleArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(consoleArea); frame.add(scrollPane, BorderLayout.CENTER); frame.setVisible(true); } // 停止計(jì)算的事件 private void stopAction(JButton stopBtn) { stopBtn.addActionListener((e) -> { cal.stop(); //thread.stop(); }); } // 暫停計(jì)算的事件 private void pauseAction(JButton pauseBtn) { pauseBtn.addActionListener((e) -> { String pauseText = pauseBtn.getText(); if (pauseText.equals("暫停計(jì)算")) { cal.suspend(); //thread.suspend(); pauseBtn.setText("繼續(xù)計(jì)算"); } else { cal.resume(); //thread.resume(); pauseBtn.setText("暫停計(jì)算"); } }); } // 開始計(jì)算的事件 private void stratAction(JButton button) { button.addActionListener((e) -> { consoleArea.setText(null); String input = textField.getText(); if(input==null || input.equals("")) { consoleArea.setText("請先輸入您要計(jì)算的階乘值"); 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(); } } }
今天就到這里啦,我們下次見哦
到此這篇關(guān)于Java介紹多線程計(jì)算階乘實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Java多線程計(jì)算階乘內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 5個人坐在一起(有關(guān)第五個人歲數(shù)的問題)
利用遞歸的方法,遞歸分為回推和遞推兩個階段。要想知道第五個人歲數(shù),需知道第四人的歲數(shù),依次類推,推到第一人(10歲),再往回推,需要的朋友可以參考下2017-02-02Java基礎(chǔ)教程之類數(shù)據(jù)與類方法
這篇文章主要介紹了Java基礎(chǔ)教程之類數(shù)據(jù)與類方法,本文是對類的深入探討,類數(shù)據(jù)指類的一些屬性、參數(shù)等,類方法就是類包含的功能方法,需要的朋友可以參考下2014-08-08spring mvc中注解@ModelAttribute的妙用分享
這篇文章主要給大家介紹了關(guān)于spring mvc中注解@ModelAttribute妙用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Android具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-09-09mybatis 自定義實(shí)現(xiàn)攔截器插件Interceptor示例
這篇文章主要介紹了mybatis 自定義實(shí)現(xiàn)攔截器插件Interceptor,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫的方法,結(jié)合實(shí)例形式分析了java針對Excel的讀寫及數(shù)據(jù)庫操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08Java實(shí)現(xiàn)無損Word轉(zhuǎn)PDF的示例代碼
本文將利用Java中的兩個jar包:pdfbox和aspose-words實(shí)現(xiàn)無損Word轉(zhuǎn)PDF功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手嘗試一下2022-06-06