我知道有一些问题,但似乎我不明白这个概念,或者它有什么问题。
基本上,我要做的是,有一个算法将继续;
for(step=0;step<value;step++){
//Do something;
}
但它应该是一个选项,因此如果用户检查isStepped复选框,用户可以看到每个步骤如何执行算法; 所以我想出的是
public void run() {
for (int step = 0; step < f; step++) {
if (isStepped) {
try {
wait();//Here is the problem
} catch (InterruptedException ex) {
Logger.getLogger(MainThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
在Menuside上;
private void nextButtonActionPerformed(java.awt.event.ActionEvent evt) {
MyThread.notify();
}
所以当下一个按钮点击时,线程应该唤醒,但它似乎不会...... 是什么导致了这个问题,我该如何克服?
答案 0 :(得分:3)
使用for循环,你试图强制线性控制台代码进行事件驱动处理,基本上试图将方形挂钩推入圆孔,这根本不起作用。正确的解决方案是不使用线程,等待甚至是for循环,而是简化所有这些,而是使用每次用户按下按钮时递增的计数器 - 更改对象的状态以响应事件
例如:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import javax.swing.*;
public class SimpleStepProcessing extends JPanel {
public static final String[] STEPS = { "Step One", "Step Two", "Step Three", "Step Four",
"Step Five", "Step Six", "Step Seven", "Step Eight", "Step Nine", "Step Ten" };
private JLabel stepLabel = new JLabel("");
private int stepCounter = 0;
private JButton nextButton = new JButton("Next");
public SimpleStepProcessing() {
nextButton.addActionListener(e -> {
stepCounter++;
if (stepCounter < STEPS.length) {
// advance program to the next step
stepLabel.setText(STEPS[stepCounter]);
}
});
stepLabel.setText(STEPS[stepCounter]);
JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 4, 4));
topPanel.add(new JLabel("Current Step:"));
topPanel.add(stepLabel);
JPanel middlePanel = new JPanel(new GridBagLayout());
middlePanel.add(nextButton);
setLayout(new BorderLayout());
add(topPanel, BorderLayout.PAGE_START);
add(middlePanel, BorderLayout.CENTER);
setPreferredSize(new Dimension(200, 100));
}
private static void createAndShowGui() {
SimpleStepProcessing mainPanel = new SimpleStepProcessing();
JFrame frame = new JFrame("SimpleStepProcessing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
答案 1 :(得分:0)
等待是在对象不在线程中定义的,并且线程的监视不是很多预测..
要等待并通知对象,您需要使用synchronized语句锁定。
创建锁定对象:
private final Object lock = new Object();
等待锁定对象:
synchronized (lock) {
lock.wait();
}
要在锁定对象上通知:
synchronized (lock)
{
lock.notify();
}
这有助于实现目标。