我是JAVA的新手,正在尝试学习一些并发概念。
我有一个简单的GUI类,它弹出一个带有1个按钮的窗口,我想将其用于暂停/继续。
另外,我有一个扩展TimerTask的类,如下所示,并从GUI开始:
public class process extends TimerTask {
public void run() {
while(true) { /*some repetitive macro commands.. */ }
}
}
真正的问题是,如何暂停按钮的onClick任务,如果已经暂停,又如何继续按钮的onClick?
我已采取措施,使用布尔值标记按钮,因为按钮从暂停更改为每次单击都会继续。
但是后来我不得不在while(button);
里面输入很多while()
来忙于等待...
您认为我可以像Thread.sleep()
之类的东西,但可以从任务线程之外进行吗?
答案 0 :(得分:1)
旧答案
基本上,TimerTask不支持暂停和继续,只能取消检查here 也许您可能想阅读有关线程的信息,因为这是我所知道的另一种选择,它具有中断和启动功能,然后您可以跟踪正在执行的操作的进度,以恢复停止的位置。
因此,我建议您通过this链接,因为您需要了解线程处理,而不仅仅是复制要使用的代码,那里有一个示例代码也肯定会解决您的问题。
请注意,运行无尽的while循环基本上会导致程序不响应,除非系统崩溃。在某个时刻,数据将变成过载,程序将溢出。这意味着它将失败。
。
新答案
因此,对于新问题,我能够运行一个小程序来演示如何在使用SWING时实现类似于多线程的功能。
重述您的问题:您想执行一个不确定的任务,比如说我们正在播放一首歌曲,然后单击按钮以暂停歌曲,再次单击应该继续播放歌曲吗?如果是这样,我认为下面的小程序可能对您有用。
public class Test{
static JLabel label;
static int i = 0;
static JButton action;
static boolean x = false; //setting our x to false initialy
public static void main(String[] args) {
JFrame f=new JFrame();//creating instance of JFrame
label = new JLabel("0 Sec"); //initialized with a text
label.setBounds(130,200,100, 40);//x axis, y axis, width, height
action=new JButton("Play");//initialized with a text
action.setBounds(130,100,100, 40);//x axis, y axis, width, height
f.add(action);//adding button in JFrame
f.add(label);
action.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
if(x){
x = false; //Update x here
action.setText("Play");
action.revalidate();
}else{
x = true; //Update x here also
action.setText("Pause");
action.revalidate();
if(x){ //Using x here to determind whether we should start our child thread or not.
(new Thread(new Child())).start();
}
}
}
});
f.setSize(500, 700);//500 width and 700 height
f.setLayout(null);//using no layout managers
f.setVisible(true);//making the frame visible
}
}
class Child implements Runnable{
@Override
public void run() {
while (x) {
//You can put your long task here.
i++;
label.setText(i+" Secs");
label.revalidate();
try {
sleep(1000); //Sleeping time for our baby thread ..lol
} catch (InterruptedException ex) {
Logger.getLogger("No Foo");
}
}
}
}