创建 Java 计时器和 TimerTask?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13194201/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Creating a Java Timer and a TimerTask?
提问by Radicate
I'm new to Java and I'm trying to set a simple timer, I'm familiar with set_interval
, because of experience with JavaScript and ActionScript,
我是 Java 新手,我正在尝试设置一个简单的计时器,我很熟悉set_interval
,因为我有 JavaScript 和 ActionScript 的经验,
I'm not so familiar with classes yet so I get confused easily, I understand that I need to set a new Timer
, and then set a TimerTask
, but I don't get how exactly to do it even though I'm looking at the documentation right now..
我对类还不太熟悉,所以我很容易混淆,我知道我需要设置一个 new Timer
,然后设置一个TimerTask
,但是即使我正在查看文档,我也不知道该怎么做现在..
So I created an Applet, and that's my init
method:
所以我创建了一个 Applet,这就是我的init
方法:
public void init() {
TimerTask myTask;
Timer myTimer;
myTimer.schedule(myTask,5000);
}
How do I actually set the task code? I wanted it to do something like
我如何实际设置任务代码?我想让它做类似的事情
g.drawString("Display some text with changing variables here",10,10);
回答by Roman C
Whatever you want to perfom i.e. drawing or smwhat, just define task and implement the code inside it.
无论您想执行什么操作,即绘图或小程序,只需定义任务并在其中执行代码即可。
import javax.swing.*;
import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;
public class TimerApplet extends JApplet {
String someText;
int count = 0;
public TimerApplet() {
Timer time = new Timer();
Сalculate calculate = new Сalculate();
time.schedule(calculate, 1 * 1000, 1000);
}
class Сalculate extends TimerTask {
@Override
public void run() {
count++;
System.out.println("working.. "+count);
someText = "Display some text with changing variables here.." +count;
repaint();
}
}
//This is how do you actually code.
@Override
public void paint(Graphics g)//Paint method to display our message
{
// super.paint(g); flickering
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, getWidth(), getHeight());
if (someText != null) {
g2d.setColor(Color.BLACK);
g2d.drawString(someText,10,10);
}
//.....
}
}
回答by nIcE cOw
As told by many a wonderful Stackoverflow users, the right idea in here is to use the javax.swing.TImer. Here is one small code snippet for your help. Do ask any question, that is beyond your grasp, I will try to provide information likewise.
正如许多优秀的 Stackoverflow 用户所说,这里的正确想法是使用javax.swing.TImer。这是一个小代码片段,可以为您提供帮助。请提出任何您无法理解的问题,我将同样尝试提供信息。
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
public class DrawStringWithTimer
{
private final int WIDTH = 400;
private final int HEIGHT = 300;
private Timer timer;
private int x;
private int y;
private int counter;
private Random random;
private String[] messages = {
"Bingo, I am ON",
"Can you believe this !!",
"What else you thinking about ?",
"Ahha, seems like you are confused now !!",
"Lets Roll and Conquer :-)"
};
private CustomPanel contentPane;
private ActionListener timerAction = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae)
{
if (counter == 5)
counter = 0;
/*
* Creating random numbers where
* x will be equal to zero or
* less than WIDTH and y will be
* equal to zero or less than HEIGHT.
* And we getting the value of the
* messages Array with counter variable
* and passing this to setValues function,
* so that it can trigger a repaint()
* request, since the state of the
* object has changed now.
*/
x = random.nextInt(WIDTH);
y = random.nextInt(HEIGHT);
contentPane.setValues(x, y, messages[counter]);
counter++;
}
};
public DrawStringWithTimer()
{
counter = 0;
x = y = 10;
random = new Random();
}
private void displayGUI()
{
JFrame frame = new JFrame("Drawing String Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = new CustomPanel(WIDTH, HEIGHT);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
/*
* javax.swing.Timer is what you need
* when dealing with Timer related
* task when using Swing.
* For more info visit the link
* as specified by @trashgod, in the
* comments.
* Two arguments to the constructor
* specify as the delay and the
* ActionListener associated with
* this Timer Object.
*/
timer = new Timer(2000, timerAction);
timer.start();
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
new DrawStringWithTimer().displayGUI();
}
});
}
}
class CustomPanel extends JPanel
{
private final int GAP = 10;
private int width;
private int height;
private int x;
private int y;
private String message = "";
public CustomPanel(int w, int h)
{
width = w;
height = h;
setOpaque(true);
setBackground(Color.WHITE);
setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
}
public void setValues(int x, int y, String msg)
{
this.x = x;
this.y = y;
message = msg;
/*
* As the state of the variables will change,
* repaint() will call the paintComponent()
* method indirectly by Swing itself.
*/
repaint();
}
@Override
public Dimension getPreferredSize()
{
return (new Dimension(width, height));
}
@Override
protected void paintComponent(Graphics g)
{
/*
* Below line is used to draw the JPanel
* in the usual Java way first.
*/
super.paintComponent(g);
/*
* This line is used to draw the dynamic
* String at the given location.
*/
g.drawString(message, x, y);
}
}
回答by Teifi
I've figured out the same problem at my small app, I know my solution is not the best, but it's simple. just use two self-changing parameters in the custom inner class. here is my code.
我在我的小应用程序中发现了同样的问题,我知道我的解决方案不是最好的,但它很简单。只需在自定义内部类中使用两个自更改参数即可。这是我的代码。
final static Random random = new Random();
....//other codes
static class MyTimerTask extends TimerTask {
int index_x = random.nextInt(50);
int index_y = random.nextInt(50);
@Override
public void run() {
System.out.println("Display some text with changing variables here: " + index_x + "," + index_y);
index_x = random.nextInt(50);
index_y = random.nextInt(50);
System.gc();
}
public static MyTimerTask getInstance() {
return new MyTimerTask();
}
}
回答by sunleo
Example as you expected in this link
Timerwill be running for ever in our application untill application is closed or When there is no more job will be available to assign or Schedule.
计时器将在我们的应用程序中永远运行,直到应用程序关闭或当没有更多工作可供分配或安排时。
TimerTask-- this is the task which has some functionality which is to be run based on time or duration.
TimerTask- 这是具有某些功能的任务,这些功能将根据时间或持续时间运行。
In Timerwe will assgin TimerTaskto run for particular duration or to start its run at particular duration.
在Timer 中,我们将分配TimerTask以运行特定持续时间或在特定持续时间开始其运行。
Please Understand how it works then apply with applet or any others
请了解它是如何工作的,然后使用小程序或任何其他应用程序
1,The GCTask class extends the TimerTask class and implements the run() method.
1、GCTask类扩展了TimerTask类并实现了run()方法。
2,Within the TimerDemo program, a Timer object and a GCTask object are instantiated.
2、在TimerDemo程序中,实例化了一个Timer对象和一个GCTask对象。
3, Using the Timer object, the task object is scheduled using the schedule() method of the Timer class to execute after a 5-second delay and then continue to execute every 5 seconds.
3、使用Timer对象,使用Timer类的schedule()方法调度任务对象,延迟5秒后执行,然后每5秒继续执行一次。
4,The infinite while loop within main() instantiates objects of type SimpleObject (whose definition follows) that are immediately available for garbage collection.
4、main() 中的无限while 循环实例化SimpleObject(其定义如下)类型的对象,这些对象可立即用于垃圾收集。
import java.util.TimerTask;
public class GCTask extends TimerTask
{
public void run()
{
System.out.println("Running the scheduled task...");
System.gc();
}
}
import java.util.Timer;
public class TimerDemo
{
public static void main(String [] args)
{
Timer timer = new Timer();
GCTask task = new GCTask();
timer.schedule(task, 5000, 5000);
int counter = 1;
while(true)
{
new SimpleObject("Object" + counter++);
try
{
Thread.sleep(500);
}
catch(InterruptedException e) {}
}
}
}
public class SimpleObject
{
private String name;
public SimpleObject(String n)
{
System.out.println("Instantiating " + n);
name = n;
}
public void finalize()
{
System.out.println("*** " + name + " is getting garbage collected ***");
}
}