由于某种原因,我的java计时器无法在我的某个程序中运行。每当我编译我的代码时,它都会给我以下错误:
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)
这是为什么? (注意:我是Java计时器的新手)
//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;
}
答案 0 :(得分:3)
由于标记中指出,您应该使用Swing
Timer,而不是使用java.util.Timer
。
请看一下这个示例:
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 );
}
}
答案 1 :(得分:1)
Timer
只能安排一次,但调度本身是固定的。只需调用timer.scheduleAtFixedRate
方法一次即可。如果您以后需要启动相同的计时器任务,则需要构建一个新的java.util.Timer
。
答案 2 :(得分:1)
线程中的异常" AWT-EventQueue-0" java.lang.IllegalStateException:任务已安排或已取消 在java.util.Timer.sched(Timer.java:401)at java.util.Timer.scheduleAtFixedRate(Timer.java:328)
因为你试图在这里再次添加相同的任务:
timer.scheduleAtFixedRate(task, 0, duration);