junior_developer181
junior_developer181

Reputation: 105

How can I pause/continue scheduled task?

I'm new to JAVA and trying to learn some concurrency concepts.
I have a simple GUI class that pops-up a window with 1 button which I want to use for pause/continue.
Also, I have a class that extends TimerTask, it looks like below and start with the GUI:

public class process extends TimerTask {
  public void run() { 
     while(true) { /*some repetitive macro commands.. */ }
  }
} 

Real question is, how can I pause the task onClick of the button and also continue onClick of the button if already paused?

I have taken a step to use a boolean to flag the button as it changes from pause to continue on each click.

But then I had to type a lot of while(button); for busy waiting inside the while()...
Do you think I can make like Thread.sleep() or something but from outside the task thread?

Upvotes: 3

Views: 173

Answers (1)

Wale
Wale

Reputation: 1796

OLD ANSWER

Basically, there is no support for pause and resume on TimerTask, you can only cancel, check here perhaps you might want to read about threading as that's the alternative I know of that has an interrupt and start features and then you can keep track of the progress of what you're doing to resume where it stopped.

So, I will suggest you go through this link, because you need to understand threading not just copy a code to use, there is a sample code there that will definitely solve your problem also.

Note that running an endless while loop will basically cause your program not to respond, unless the system crashes. At a certain point, the data becomes an overload and the program will overflow. This means it will fail.

.

NEW ANSWER

So, response to the new question, I was able to run a tiny little program to demonstrate how you can achieve something that looks like multithreading when working with SWING.

To rephrase your question: You want to run an indefinite task like let say we're playing a song, and then onclick of a button to pause the song, on click again should continue the song?, if so, I think below tiny program might work for you.

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

Upvotes: 1

Related Questions