我正在尝试使用 java.util.timer 定期安排任务;我不知道怎么办

I'm trying to use java.util.timer to schedule a task periodically; i'm not sure how

我研究了一段时间后在一定时间后安排任务的不同方法(即 Quartz、ScheduledThreadPool、java.util.timer),但我在理解如何使用它时遇到了问题。

这只是我从研究中找到的一个示例,下面我将插入我正在创建的代码。 --->

import java.util.Timer;
import java.util.TimerTask;

public class TaskManager {

    private Timer timer = new Timer();

    public static void main(String[] args) {
        TaskManager manager = new TaskManager();
        manager.startTask();
    }

    public void startTask() {
        timer.schedule(new PeriodicTask(), 0);
    }

    private class PeriodicTask extends TimerTask {
        @Override
        public void run() {
            System.out.println(System.currentTimeMillis() + " Running");

            /* replace with the actual task */
            try {
                Thread.sleep(15 * 1000);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
            /* end task processing */

            System.out.println(System.currentTimeMillis() + " Scheduling 10 seconds from now");
            timer.schedule(new PeriodicTask(), 10 * 1000);
        }
    }
}

请忽略 GUI App 方法,为了清楚起见,我只是将其插入。我也知道我的代码可能没有组织,所以我提前为此感到抱歉。

基本上我已经创建了一个包含三个框架的 GUI; first 只是起始帧,因此可以忽略。第二帧基本上会使用定时器。我想做的是创建一个记忆游戏,在 12 个 JButtons 的数组中显示从 1 到 12 的 12 个随机数(我已经这样做了),然后在指定的时间后删除或隐藏(以更好的为准)数字和正在玩的人必须按升序点击它们。如果此人确实点击正确 he/she 将获得 1 分,否则该人将得不到任何分数。然后他点击 "Check Answer" 按钮,数字重置,计时器再次启动。这只会发生 15 次。

为了清楚起见,我需要的所有帮助都是实现计时器属性。感谢所有花时间阅读本文的人。你是救命恩人!

// The "TryTryTryAgain" class.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.URL;
import java.util.Arrays;
import java.util.TimerTask;
import java.util.Date;
import java.util.Timer;


public class JavaMemoryGame_Final {
  static JButton btnStart, buttonArray[] = new JButton[12];
  static JFrame start, questions, survey;
  static JTextField nameEnter;
  static JLabel scoreOutput, lblTitle, lblPrompt1, lblPrompt2, t_fImage, lblInstruct, lblReadyCheck;
  static JRadioButton reallyBad, bad, good, reallyGood;
  static AudioClip clap, yess, noo;
  static ButtonGroup finalSurvey;
  static DefaultListModel listModel;
  static JList difficulty;
  static int randNumGenerator;
  static int score = 0, arrayImage[] = new int[12];


  private Timer timer = new Timer();


  public static JButton[] randNum() {

    arrayImage[0] = (int)(Math.random() * 12) + 1;
    arrayImage[1] = (int)(Math.random() * 12) + 1;
    while (arrayImage[1] == arrayImage[0]) {
      arrayImage[1] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[2] = (int)(Math.random() * 12) + 1;
    while (arrayImage[2] == arrayImage[1] || arrayImage[2] == arrayImage[0]) {
      arrayImage[2] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[3] = (int)(Math.random() * 12) + 1;
    while (arrayImage[3] == arrayImage[2] || arrayImage[3] == arrayImage[1] || arrayImage[3] == arrayImage[0]) {
      arrayImage[3] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[4] = (int)(Math.random() * 12) + 1;
    while (arrayImage[4] == arrayImage[3] || arrayImage[4] == arrayImage[2] || arrayImage[4] == arrayImage[1] || arrayImage[4] == arrayImage[0]) {
      arrayImage[4] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[5] = (int)(Math.random() * 12) + 1;
    while (arrayImage[5] == arrayImage[4] || arrayImage[5] == arrayImage[3] || arrayImage[5] == arrayImage[2] || arrayImage[5] == arrayImage[1] || arrayImage[5] == arrayImage[0]) {
      arrayImage[5] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[6] = (int)(Math.random() * 12) + 1;
    while (arrayImage[6] == arrayImage[5] || arrayImage[6] == arrayImage[4] || arrayImage[6] == arrayImage[3] || arrayImage[6] == arrayImage[2] || arrayImage[6] == arrayImage[1] || arrayImage[6] == arrayImage[0]) {
      arrayImage[6] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[7] = (int)(Math.random() * 12) + 1;
    while (arrayImage[7] == arrayImage[6] || arrayImage[7] == arrayImage[5] || arrayImage[7] == arrayImage[4] || arrayImage[7] == arrayImage[3] || arrayImage[7] == arrayImage[2] || arrayImage[7] == arrayImage[1] || arrayImage[7] == arrayImage[0]) {
      arrayImage[7] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[8] = (int)(Math.random() * 12) + 1;
    while (arrayImage[8] == arrayImage[7] || arrayImage[8] == arrayImage[6] || arrayImage[8] == arrayImage[5] || arrayImage[8] == arrayImage[4] || arrayImage[8] == arrayImage[3] || arrayImage[8] == arrayImage[2] || arrayImage[8] == arrayImage[1] || arrayImage[8] == arrayImage[0]) {
      arrayImage[8] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[9] = (int)(Math.random() * 12) + 1;
    while (arrayImage[9] == arrayImage[8] || arrayImage[9] == arrayImage[7] || arrayImage[9] == arrayImage[6] || arrayImage[9] == arrayImage[5] || arrayImage[9] == arrayImage[4] || arrayImage[9] == arrayImage[3] || arrayImage[9] == arrayImage[2] || arrayImage[9] == arrayImage[1] || arrayImage[9] == arrayImage[0]) {
      arrayImage[9] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[10] = (int)(Math.random() * 12) + 1;
    while (arrayImage[10] == arrayImage[9] || arrayImage[10] == arrayImage[8] || arrayImage[10] == arrayImage[7] || arrayImage[10] == arrayImage[6] || arrayImage[10] == arrayImage[5] || arrayImage[10] == arrayImage[4] || arrayImage[10] == arrayImage[3] || arrayImage[10] == arrayImage[2] || arrayImage[10] == arrayImage[1] || arrayImage[10] == arrayImage[0]) {
      arrayImage[10] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[11] = (int)(Math.random() * 12) + 1;
    while (arrayImage[11] == arrayImage[10] || arrayImage[11] == arrayImage[9] || arrayImage[11] == arrayImage[8] || arrayImage[11] == arrayImage[7] || arrayImage[11] == arrayImage[6] || arrayImage[11] == arrayImage[5] || arrayImage[11] == arrayImage[4] || arrayImage[11] == arrayImage[3] || arrayImage[11] == arrayImage[2] || arrayImage[11] == arrayImage[1] || arrayImage[11] == arrayImage[0]) {
      arrayImage[11] = (int)(Math.random() * 12) + 1;
    }

    for (int x = 0; x <= 11; x++) {
      buttonArray[x] = new JButton("" + arrayImage[x]);
      buttonArray[x].setBackground(Color.orange);
    }
    for (int i = 0; i <= 11; i++) {
      buttonArray[i].setActionCommand("" + arrayImage[i]);

    }

    return buttonArray;
  }


  private static void guiApp() {

    start = new JFrame("Welcome");
    start.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    questions = new JFrame("Memry_Game");
    questions.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    survey = new JFrame("How Was It?");
    survey.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    btnStart = new JButton("Enter");

    lblTitle = new JLabel("Memory Match Game!");
    lblInstruct = new JLabel("Welcome to the Memory Match Game!");
    lblPrompt1 = new JLabel("Please enter your first name:");
    lblPrompt2 = new JLabel("Choose Difficulty (#of seconds):");
    nameEnter = new JTextField("");
    scoreOutput = new JLabel("Score: " + score + "/15");
    reallyBad = new JRadioButton("Really Bad");
    bad = new JRadioButton("Bad");
    good = new JRadioButton("Good");
    reallyGood = new JRadioButton("Really Good");
    lblReadyCheck = new JLabel("");

    finalSurvey = new ButtonGroup();
    finalSurvey.add(reallyBad);
    finalSurvey.add(bad);
    finalSurvey.add(good);
    finalSurvey.add(reallyGood);



    //Declare Audio
    /*URL ebob = JavaMemoryGame_Final.class.getResource ("");
    clap = Applet.newAudioClip (ebob);
    URL bob = JavaMemoryGame_Final.class.getResource ("yes-1.wav");
    yess = Applet.newAudioClip (bob);
    URL tom = JavaMemoryGame_Final.class.getResource ("no-6.wav");
    noo = Applet.newAudioClip (tom);*/

    //set up radio buttons
    finalSurvey = new ButtonGroup();
    finalSurvey.add(reallyBad);
    finalSurvey.add(bad);
    finalSurvey.add(good);
    finalSurvey.add(reallyGood);

    //Set Up List Model
    listModel = new DefaultListModel();
    listModel.addElement("10");
    listModel.addElement("15");
    listModel.addElement("30");

    //Set Up List
    difficulty = new JList(listModel);
    difficulty.setVisibleRowCount(1);
    JScrollPane listScroll = new JScrollPane(difficulty);



    for (int x = 0; x <= 11; x++) {
      buttonArray[x] = new JButton("");
      buttonArray[x].setBackground(Color.orange);
    }


    ButtonHandler onClick = new ButtonHandler();
    btnStart.addActionListener(onClick);
    for (int y = 0; y <= 11; y++) {
      buttonArray[y].addActionListener(onClick);
    }



    JPanel mainStart = new JPanel(new BorderLayout());
    mainStart.setBackground(Color.orange);
    mainStart.setForeground(Color.orange);
    JPanel scoreStuffs = new JPanel(new GridLayout(1, 2));
    JPanel mainContent = new JPanel(new GridLayout(2, 2));
    mainContent.setBackground(Color.orange);
    mainStart.setForeground(Color.orange);
    JPanel gameBoard = new JPanel(new GridLayout(2, 6));
    gameBoard.setBackground(Color.orange);
    JPanel gameContent = new JPanel(new GridLayout(1, 2));
    JPanel mainGame = new JPanel(new BorderLayout());
    mainGame.setBackground(Color.orange);
    JPanel buttonScore = new JPanel(new GridLayout(3, 1));
    buttonScore.setBackground(Color.orange);
    JPanel feedbackPanel = new JPanel(new BorderLayout());
    feedbackPanel.setForeground(Color.blue);



    //Seperate Panels
    mainContent.add(lblPrompt1);
    mainContent.add(lblPrompt2);
    mainContent.add(nameEnter);
    mainContent.add(listScroll);

    //Score Stuff for main Panel
    scoreStuffs.add(scoreOutput);
    scoreStuffs.add(btnStart);


    //Main Welcome PAnel
    mainStart.add(lblInstruct, BorderLayout.NORTH);
    mainStart.add(mainContent, BorderLayout.CENTER);
    mainStart.add(scoreStuffs, BorderLayout.SOUTH);


    //GAme Board
    gameContent.add(btnStart);
    gameContent.add(scoreOutput);
    gameBoard.add(buttonArray[0]);
    gameBoard.add(buttonArray[1]);
    gameBoard.add(buttonArray[2]);
    gameBoard.add(buttonArray[3]);
    gameBoard.add(buttonArray[4]);
    gameBoard.add(buttonArray[5]);
    gameBoard.add(buttonArray[6]);
    gameBoard.add(buttonArray[7]);
    gameBoard.add(buttonArray[8]);
    gameBoard.add(buttonArray[9]);
    gameBoard.add(buttonArray[10]);
    gameBoard.add(buttonArray[11]);


    mainGame.add(gameBoard, BorderLayout.CENTER);
    mainGame.add(gameContent, BorderLayout.PAGE_END);



    Container contentPane = start.getContentPane();
    contentPane.add(mainStart);
    Container contentPane1 = questions.getContentPane();
    contentPane1.add(mainGame);
    Container contentPane2 = survey.getContentPane();
    contentPane2.add(feedbackPanel);
    start.setSize(600, 450);
    start.setVisible(true);
    questions.setSize(500, 250);
    questions.setVisible(true);
    survey.setSize(600, 450);
    survey.setVisible(true);



  }




  private static class ButtonHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      String textFieldValue = nameEnter.getText();
      int index = difficulty.getSelectedIndex();
      int selected = difficulty.getSelectedValue().toInt();
      int check = 0;

      while (check == 0) {
        if (e.getSource() == ("Enter") && textFieldValue.length() != 0 && index > 0) {
          lblPrompt1.setText("Thank You!");
          lblPrompt2.setText("Thank You!");
          btnStart.setText("Start?");
          check = check + 1;
        } else if (e.getSource() == ("Enter") && textFieldValue.length() == 0) {
          lblPrompt1.setText("Enter first name before continuing!");
          btnStart.setText("Check");
        }
      }

      if (e.getSource() == ("Start?")) {
        start.setVisible(false);
        questions.setVisible(true);

      }





    }
  }


  public void startTask() {
    timer.schedule(new PeriodicTask(), 0);
  }



  private class PeriodicTask extends TimerTask {@
    Override
    public void run() {
      System.out.println(System.currentTimeMillis() + " Running");

      /* replace with the actual task */
      try {
        Thread.sleep(15 * 1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      /* end task processing */

      System.out.println(System.currentTimeMillis() + " Scheduling 10 seconds from now");
      timer.schedule(new PeriodicTask(), 10 * 1000);
    }
  }



  public static void main(String[] args) {
      javax.swing.SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            guiApp();
          }
        }


      );


    } // main method
} // TryTryTryAgain class

使用java.awt.event.ActionListener.

import java.awt.event.*;
Timer t = new Timer(10, //will run every 10 ms
                    new Listener());
t.start();

private class Listener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e){
        //Code here will execute every (10) ms.
    }
}

我认为有些混乱。计时器 class 创建一个新线程和该线程上的 运行s 任务,以在未来的指定时间或以指定的时间间隔重复执行任务。下面的代码描述了一个以两秒为间隔移动一个红点的 Swing class。 Thread.sleep 方法导致包含它的线程等待指定的时间段。 (睡眠可能会被各种事件打断。)您第一次使用计时器实际上是一个假人,因为用于延迟的零意味着任务是 运行,延迟为零。

您的 PeriodicTask class 打印一条消息,等待 15 秒,打印一条消息,安排 10 秒后重复该任务,然后退出。

package bradleyross.swing;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyListener;
import java.lang.reflect.InvocationTargetException;
import java.awt.event.KeyEvent;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.SwingUtilities;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
/**
 * This Swing demo creates a JPanel component and randomly 
 * moves a red dot within the panel when triggered by a
 * timer.
 * 
 * @author Bradley Ross
 *
 */
public class SwingTimer implements Runnable{
    protected JFrame mainFrame;
    protected FlowLayout layout;
    protected MyPanel panel;
    protected int xPos = 0;
    protected int yPos = 0;
    protected Random random = new Random();
    protected Timer timer = new Timer();
    public void run() {
        buildFrame();
    }
    /**
     * Action listener for this application.
     * @author Bradley Ross
     *
     */
    protected class Listener1 implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            System.out.println("Action " + e.getActionCommand());
        }

    }
    /**
     * Key listener for this application.
     * @author Bradley Ross
     *
     */
    protected class Listener2 implements KeyListener {
        /** 
         * Action when key event is detected.
         *  @param e key event
         */
        public void keyTyped(KeyEvent e) {
            System.out.println("Keystroke received " + e.getKeyChar());
        }
        public void keyPressed(KeyEvent e) { ; }
        public void keyReleased(KeyEvent e) { ; }

    }
    /**
     * This subclass of JPanel repaints the
     * the dot using {@link SwingTimer#xPos} and 
     * {@link SwingTimer#yPos}.
     * 
     * @author Bradley Ross
     *
     */
    @SuppressWarnings("serial")
    public class MyPanel extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.fillOval(xPos,  yPos, 5, 5);
        }
    }
    /**
     * Executed each time the timer triggers an event.
     * 
     * <p>It randomly repositions the dot within the
     *    panel.</p>
     * @author Bradley Ross
     *
     */
    public class Motion extends TimerTask {
        public void run() {
            xPos = random.nextInt(300);
            yPos = random.nextInt(300);
            panel.repaint();
        }
    }
    public void buildFrame() {
        xPos = random.nextInt(300);
        yPos = random.nextInt(300);
        KeyListener listener2 = new Listener2();
        ActionListener listener1 = new Listener1();
        mainFrame = new JFrame();
        layout = new FlowLayout(FlowLayout.LEADING);
        mainFrame.setLayout(layout);
        mainFrame.addKeyListener(listener2);
        JButton first = new JButton("First");
        first.setActionCommand("first");
        first.addActionListener(listener1);
        first.addKeyListener(listener2);
        first.setFocusable(false);
        mainFrame.add(first);
        mainFrame.setFocusable(true);
        panel = new MyPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.black));
        panel.setPreferredSize(new Dimension(300,300));
        panel.setForeground(Color.red);
        panel.addKeyListener(listener2);
        panel.repaint();
        timer.scheduleAtFixedRate(new Motion(), 0  , 2000);
        mainFrame.add(panel);
        mainFrame.setSize(500, 500);
        mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        mainFrame.setVisible(true);
    }
    /**
     * Main driver.
     * @param args not used in this example
     */
    public static void main(String[] args) {
        try {
            SwingUtilities.invokeAndWait(new SwingTimer());
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}