线程(3)

Timer和Swing Timer

  • java提供了Timer和Swing Timer控件,用于执行规划好的任务或循环任务 *

Timer:

使用步骤:

  1. 定义一个类继承TimerTask,重写其中的run()方法,这个方法就是所要执行的任务代码
  2. 创建Timer对象,通常使用不带参数的构造方法Timer()直接实例化
  3. 调用Timer对象的schedule()方法安排任务,传递一个TimerTask对象作为参数
  • schedule(TimerTask task,Date time):在指定的时间执行任务
  • schedule(TimerTask task,Date firstTime,long period):第一次到达指定时间firsttime时执行特定任务,并且每隔period参数指定的时间(毫秒)重复执行该任务
  • schedule(TimerTask task,long delay,long period):延迟delay时间第一次执行任务,并且每隔period时间重复执行该任务
  1. 为取消一个规划好的任务,调用Timer对象的cancel方法

Swing Timer:

功能与Timer类一样,但只能在Swing应用程序中使用,可以处理线程共享,且不用将规划好的任务放在TimerTask子类的run()方法中,而是在actionPerformed()方法中编写所要执行的任务代码。

当要取消某个任务时,只需调用stop()方法即可

语法格式:

1
Timer(int delay,ActionListener listener)

其中:

  • 参数delay用于规定从调用start()方法开始到第一次执行该任务的时间间隔(单位为毫秒)
  • 参数listener指定监听对象,即ActionListener类的实例

使用步骤:

  1. 定义一个监听类,实现ActionListener监听接口,并重写actionPerformed方法,在该方法中编写所执行任务的代码
  2. 创建javax.swing.Timer对象
  3. 调用start()方法启动Swing Timer
  4. 取消任务时可以调用stop()方法停止Swing Timer

代码实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package 线程;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
//多线程案例,采用三种方法实现窗口背景,标签文字,不断变化,按钮左右移动
import javax.swing.JPanel;

public class MutilThreadDemo extends JFrame{
// 定义窗口,标签,按钮
JPanel jPanel=null;
JLabel jLabel=null;
JButton jButton=null;
String word[]= {"桐乃","小埋","宫子","日向"};
int index=0;
int movex=5;
//构造函数
public MutilThreadDemo() {
// TODO Auto-generated constructor stub
jPanel=new JPanel();
jLabel=new JLabel(word[0]);
jButton=new JButton("左右横移");
jLabel.setFont(new Font("黑体",Font.BOLD,28));
jLabel.setBounds(80,50,250,50);
jButton.setBounds(0,150,120,25);
jPanel.add(jLabel);
jPanel.add(jButton);
this.add(jPanel);
this.setSize(500,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//采用Thread改变背景
new ChangeColor().start();
//采用Timer改变文字
new Timer().schedule(new ChangeWord(), 0,1000);
//采用Swing Timer改变按钮位置
new javax.swing.Timer(100, new ChangePos()).start();
}
class ChangeColor extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
while (this.isAlive()) {
int r=(int)(Math.random()*256);
int g=(int)(Math.random()*256);
int b=(int)(Math.random()*256);
jPanel.setBackground(new Color(r,g,b));
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}

class ChangeWord extends TimerTask{
@Override
public void run() {
// TODO Auto-generated method stub
jLabel.setText(word[index++]);
if(index==word.length)
index=0;
}
}

class ChangePos implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
int x=jButton.getX()+movex;
if(x<=0) {
//换方向
x=0;
movex=-movex;
}else if(x>=getWidth()-jButton.getWidth()) {
x=getWidth()-jButton.getWidth();
movex=-movex;
}
jButton.setLocation(x,jButton.getY());
}
}

public static void main(String[] args) {
MutilThreadDemo mutilThreadDemo=new MutilThreadDemo();
mutilThreadDemo.setVisible(true);
}
}

运行结果如下:

运行结果


线程(3)
https://shanhainanhua.github.io/2019/09/07/线程-3/
作者
wantong
发布于
2019年9月7日
许可协议