如何暂停/继续预定的任务?

时间:2019-11-24 00:46:19

标签: java

我是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()之类的东西,但可以从任务线程之外进行吗?

1 个答案:

答案 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");
                }
            } 
        }
    }