Java中的实现线程体方式3
实现线程体方式3是实现线程体方式2的变种,本质上还是实现线程体方式2,但是在Android应用开发中经常采用第3种方式。下面我们看第3种方式的计时器代码清单8-3,完整代码请参考chapter8_2工程中 chapter8_2_2代码部分。
【代码清单8-3】
public class chapter8_2_2 extends Frame implements ActionListener {
private Label label;
private Button button1;
private Thread clockThread;
private boolean isRunning = false;
private int timer = 0;
public chapter8_2_2() {
button1 = new Button("结束计时");
label = new Label("计时器启动...");
button1.addActionListener(this);
setLayout(new BorderLayout());
add(button1, "North");
add(label, "Center");
setSize(320, 480);
setVisible(true);
/* 线程体是Clock对象本身,线程名字为"Clock" */
clockThread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
try {
Thread.currentThread().sleep(1000);
timer++;
label.setText("逝去了 " + timer + " 秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
clockThread.start(); /* 启动线程 */
isRunning = true;
}
@Override
public void actionPerformed(ActionEvent event) {
isRunning = false;
}
public static void main(String args[]) {
chapter8_2_2 a = new chapter8_2_2();
}
}
private Label label;
private Button button1;
private Thread clockThread;
private boolean isRunning = false;
private int timer = 0;
public chapter8_2_2() {
button1 = new Button("结束计时");
label = new Label("计时器启动...");
button1.addActionListener(this);
setLayout(new BorderLayout());
add(button1, "North");
add(label, "Center");
setSize(320, 480);
setVisible(true);
/* 线程体是Clock对象本身,线程名字为"Clock" */
clockThread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
try {
Thread.currentThread().sleep(1000);
timer++;
label.setText("逝去了 " + timer + " 秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
clockThread.start(); /* 启动线程 */
isRunning = true;
}
@Override
public void actionPerformed(ActionEvent event) {
isRunning = false;
}
public static void main(String args[]) {
chapter8_2_2 a = new chapter8_2_2();
}
}
与第2种方式比较,我们发现Frame类不再实现Runnable接口了,而是在实例化Thread类的时候,定义了一个实现Runnable接口的匿名内部类:
clockThread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
try {
Thread.currentThread().sleep(1000);
timer++;
label.setText("逝去了 " + timer + " 秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
@Override
public void run() {
while (isRunning) {
try {
Thread.currentThread().sleep(1000);
timer++;
label.setText("逝去了 " + timer + " 秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
有关Java多线程的内容还有很多,例如线程优先级、线程同步等,由于这些内容与本书关系不是很紧密,所以不再介绍了,有关其他的线程知识可以参考Java方面的书籍。接下来介绍一下Android中的线程。