0
我有一個程序可以估計每百萬次試驗的PI值。但是,我希望程序在點擊暫停時恢復,並在點擊運行時恢復,使用wait()
和notify()
。我想暫停並恢復我的程序
我必須使用多個線程以及Boolean
作爲它應該暫停和運行的信號,但我不知道如何。我很困惑。
任何想法?
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Ex03 extends JFrame implements Runnable, ActionListener {
int n = 0;
int c = 0;
double Pi;
int change = 1000000;
boolean runing = true;
JLabel actualpi = new JLabel("The Actual value of PI " + Math.PI);
JLabel estimation = new JLabel("Current Estimate: ");
JLabel tri = new JLabel("Number Of Trials: " + n);
JButton run = new JButton("Run");
JButton pause = new JButton("Pause");
public Ex03() {
super("Ex 03");
setLayout(new GridLayout(4, 1));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 400);
setVisible(true);
add(actualpi);
add(estimation);
add(tri);
add(run);
run.addActionListener(this);
pause.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
Thread thread = new Thread(this);
if (e.getSource() == run) {
thread.start();
remove(run);
add(pause);
} else if (e.getSource() == pause) {
remove(pause);
add(run);
try {
thread.wait();
} catch (InterruptedException e1) {
}
}
}
public void run() {
n++;
while (runing) {
double x = Math.random();
double y = Math.random();
if (((x * x) + (y * y)) <= 1)
c++;
n++;
Pi = (4.0 * (double) c/n);
if (n == change) {
estimation.setText("Current Estimate: " + Pi);
tri.setText("Number Of Trials: " + n);
change = change + 1000000;
}
try {
Thread.sleep(0);
} catch (InterruptedException e) {
}
}
}
public static void main(String[] args) {
new Ex03();
}
}
你不應該使用等待和通知。他們太低級,很難很好地使用。使用更高級別的抽象:從鎖創建的條件。閱讀javadoc的例子。請注意,你的'runing'標誌應該是揮發性的。而且它沒用,因爲你可以使用interrupt()來中斷線程。再次,閱讀javadoc。併發性是一個非常困難的話題。我建議你在實踐中閱讀Java併發,因爲你的簡單例子表明你錯過了很多東西。 –
在你甚至是監聽器的內部,你每次用戶按下按鈕時都會創建* new *線程對象。如果您想訪問已經創建的線程來暫停它,這將不起作用。在類的構造函數中只創建一次線程並將其保存到字段中,然後在該字段上使用'wait'' notify'。 – csharpfolk