Java6学习笔记42——Java中的计时器

1.最简陋的计时器wait
每个类都有一个wait方法,这个东西控制起来看似很简单,但是它很可能被另一个线程甚至是程序打乱。

public class TimerDemo1 {
public static void main(String arg[]) {
TimerDemo1 t = new TimerDemo1();
System.out.println("Pause for five seconds.");
synchronized(t) {//首先要先调用同步方法确定同步块,利用类变量来获得同步锁,通过同步锁的互斥性来实现同步。
try {
t.wait(1000L * 5L);
} catch(InterruptedException e) {//同时注意处理异常
System.out.println("Pause interrupted");
}
}
System.out.println("Pause completed");
}
}

2.Timer类和TimerTask类

以下这个例子说明了你可以使用Timer类在某个时间后产生另一个线程。

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

public class TimerDemo2 {
public static void main(String arg[]) {
Timer t = new Timer();
System.out.println("About to set timer.");
TimerDemoTask2 task = new TimerDemoTask2();
t.schedule(task,1000L * 5L);
System.out.println("Timer set.");
}
}

class TimerDemoTask2 extends TimerTask {
public void run() {
System.out.println("Timer fired!");
System.exit(0);
}
}

============================
我们还可以写一个让其周而复始的Timer。
import java.util.Timer;
import java.util.TimerTask;

public class TimerDemo3 {
public static void main(String arg[]) {
Timer t = new Timer();
System.out.println("About to set timer.");
TimerDemoTask3 task = new TimerDemoTask3();
t.schedule(task,1000L + 10L,1000L * 2L);//第三个参数指定了第一次调用之后,从第二次开始每隔多长的时间调用一次 run() 方法。

System.out.println("Timer set.");
}
}

class TimerDemoTask3 extends TimerTask {
private int counter = 0;
public void run() {
System.out.println("Timer fired " + counter++);
if(counter > 5)
System.exit(0);
}
}

3.SWing中的Timer

import javax.swing.Timer;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class TimerDemo4 extends JFrame implements ActionListener {
public static void main(String arg[]) {
new TimerDemo4();
}
public TimerDemo4() {
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
} );
Timer t = new Timer(1000 * 1,this);//1秒触发一次事件,不停的触发
t.start();
buildMenu();
buildFrame();
setLocation(250,150);
setVisible(true);
}
private void buildFrame() {
JButton exitButton = new JButton("Exit");
exitButton.addActionListener(this);
add(exitButton);
setSize(300,200);
}
private void buildMenu() {
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
menuBar.add(fileMenu);
JMenuItem exitMenuItem = new JMenuItem("Exit");
exitMenuItem.addActionListener(this);
fileMenu.add(exitMenuItem);
setJMenuBar(menuBar);
}
public void actionPerformed(ActionEvent e) {//不使用run方法,而是ActionEvent的相应,和Mouse的相应混在一起处理了,而是注意SWing的Timer在程序退出时也退出了,这一点与上述不同。
String selection = e.getActionCommand();
if(selection == null)
System.out.println("Timer fired!");
else if(selection.equals("Exit")) {
System.exit(0);
}
}
}

你可能感兴趣的:(java,swing)