我正在尝试学习Swing中的Threads。
我有一个带有JProgressBar(进度)的框架,五个JButton(开始,暂停,恢复,取消,关闭)和一个JLabel(label1)。
框架打开。仅启用启用。开始调用我的课程Progressor:
一次又一次更新
进步者进步者; //声明为类变量,在构造函数中初始化new
,再次在重写done
方法中
这是ButtonListener类:
public class ButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == jbStart) {
progressor.execute();
label1.setText("Progressing ...");
jbCancel.setEnabled(true);
jbResume.setEnabled(true);
jbSuspend.setEnabled(true);
jbClose.setEnabled(true);
}
if(e.getSource() == jbCancel) {
progressor.cancel(true);
label1.setText("Progress Canceled");
}
if (e.getSource() == jbSuspend) {
label1.setText(progressor.suspendProgress());
}
if (e.getSource() == jbResume) {
label1.setText(progressor.resumeProgress());
}
if (e.getSource() == jbClose) {
dispose();
}
}
} // buttonlistener
这是SwingWorker类:
public class Progressor extends SwingWorker<Void, Integer> {
private volatile boolean suspend = false;
private Object lock = new Object();
@Override
protected Void doInBackground() {
for (int i = 0; i <= 10; i++) {
checkForSuspend();
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
}
publish(i);
}
return null;
}
@Override
protected void process(List<Integer> list) {
int value = list.get(list.size() - 1);
progress.setValue(value);
}
public void checkForSuspend() {
synchronized (lock) {
while (suspend) {
try {
lock.wait();
} catch (InterruptedException ie){
}
}
}
}//checkForSuspend
@Override
protected void done() {
label1.setText("All Done. Press close to exit");
progressor = new Progressor();
}
public synchronized String suspendProgress() {
suspend = true;
return "Progress suspended ...";
}
public synchronized String resumeProgress() {
synchronized (lock) {
suspend = false;
lock.notify();
return "Progress resumed ...";
}
}
}//Progressor class
一切正常,但cancel
实际上并没有取消线程(进度条继续)。
我应该在取消前暂停吗?
答案 0 :(得分:0)
此How to Pause and Resume a Thread in Java from another Thread问题与您的问题非常相似,并且在答案中有一些很好的例子。
至于你自己的代码以及为什么它不起作用:
暂停进度器时完成工作而不是暂停。正如上面的问题所述 - 您应该在计算的某些点上查看标志并对其进行操作。示例:
while (!cancel) {
if (!suspended) {
for (int i = 1; i <= 10; i++) {
Thread.sleep(1000);
publish(i);
}
}
}
上面的代码将在下一次达到10时暂停(除非你在此之前恢复),并在按下取消时结束(取消需要以明显的方式添加为额外标志)。
答案 1 :(得分:0)
你的线程应该在while循环中运行,该循环查找一个布尔值来改变另一个对象的值,然后单击按钮时只需用setPause(true / false)更改状态:
while(true){
if(object_everyone_can_reference.getPause()){
Thread.sleep(1000);
}
}