Java Timer Not Working

1.3k views Asked by At

For some reason my java timer is not working in one of my programs. Whenever I compile my code, it gives me the following error:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: 
  Task already scheduled or cancelled 
    at java.util.Timer.sched(Timer.java:401) 
    at java.util.Timer.scheduleAtFixedRate(Timer.java:328)

Why is this? (Note: I am a novice at Java timers)

//Timer Prerequisites
Timer timer = new Timer();
TimerTask task = new TimerTask()
{
    public void run()
    {
        System.out.println("We have waited one second.");
    }
};

//Check to see if user has enetered anything
while(!answered)
{
timer.scheduleAtFixedRate(task, 0, duration);
afk = true;
incorrect += 1;
answered = true;
}          
3

There are 3 answers

2
nanofarad On

A Timer can only be scheduled once, but the scheduling itself is at a fixed rate. Simply call the timer.scheduleAtFixedRate method once. If you need to start the same timer task later, you will need to construct a new java.util.Timer.

0
Juned Ahsan On

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Task already scheduled or cancelled at java.util.Timer.sched(Timer.java:401) at java.util.Timer.scheduleAtFixedRate(Timer.java:328)

Because you are trying to add the same task again here:

timer.scheduleAtFixedRate(task, 0, duration);
5
nIcE cOw On

Since as noted in the tag, you should be using Swing Timer, instead of using the java.util.Timer.

Please have a look at this sample example:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingTimerExample {

    private String[] questions = {
        "How are you?",
        "How is your day?",
        "Will you work tonight?"
    };

    private JLabel questionLabel;
    private ButtonGroup radioGroup;
    private JRadioButton yesRadioButton;
    private JRadioButton noRadioButton;

    private int counter;

    private static final int GAP = 5;

    private Timer timer;

    private ActionListener timerActions = new ActionListener () {
        @Override
        public void actionPerformed ( ActionEvent ae ) {
            ++counter;
            counter %= questions.length;
            questionLabel.setText ( questions [ counter ] );
            if ( counter == questions.length - 1 ) {
                ( ( Timer ) ae.getSource () ).stop ();
            }
        }
    };

    public SwingTimerExample () {
        counter = 0;
    }

    private void displayGUI () {
        JFrame frame = new JFrame ( "Swing Timer Example" );
        frame.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );

        JPanel contentPane = new JPanel ();
        contentPane.setBorder ( BorderFactory.createEmptyBorder (
            GAP, GAP, GAP, GAP ) );
        contentPane.setLayout ( new BorderLayout ( GAP, GAP ) );

        JPanel labelPanel = new JPanel ();
        questionLabel = new JLabel ( 
                            questions [ counter ], JLabel.CENTER);
        labelPanel.add ( questionLabel );

        JPanel radioPanel = new JPanel ();
        yesRadioButton = new JRadioButton ( "YES" );
        noRadioButton = new JRadioButton ( "NO" );
        radioGroup = new ButtonGroup ();
        radioGroup.add ( yesRadioButton );
        radioGroup.add ( noRadioButton );
        radioPanel.add ( yesRadioButton );
        radioPanel.add ( noRadioButton );

        contentPane.add ( labelPanel, BorderLayout.CENTER );
        contentPane.add ( radioPanel, BorderLayout.PAGE_END );

        frame.setContentPane ( contentPane );
        frame.pack ();
        frame.setLocationByPlatform ( true );
        frame.setVisible ( true );

        timer = new Timer ( 5000, timerActions );
        timer.start ();
    }

    public static void main ( String[] args ) {
        Runnable runnable = new Runnable () {
            @Override
            public void run () {
                new SwingTimerExample ().displayGUI ();
            }
        };
        EventQueue.invokeLater ( runnable );
    }
}