后台线程
后台线程是指为其他线程提供服务的线程,也成为守护线程。Java虚拟机的垃圾回收线程就是典型的后台线程,他负责回收其他线程不在使用的内存。
后台线程特点是:只有当前台线程结束生命周期后,后台线程才会结束生命周期。主线程默认是前台线程。
调用Thread类的setDaemon(true)方法可以把一个线程设置为后台线程。
Thread类的isDaemon()方法可以判断一个线程是否是后台线程。
使用后台线程需要注意:
- 当所有前台线程运行结束时,如果还有后台线程在运行,Java虚拟机会终止后台线程。此外后台线程不一定在前台线程之后结束生命周期。
- 只有在线程启动前才能将其设为后台线程。如果在线程启动后再设置为后台线程,不会出现编译错误,但运行时会抛出异常java.lang.IllegalThreadStateException。
- 由前台线程创建的线程默认仍是前台线程;由后台线程创建的线程默认也是后台线程。
定时器
在JDK的java.util包提供了一个实用类定时器Timer,它能够定时执行特定的任务。TimerTask表示定时器执行的一项任务。
public class TimerTest extends Thread{
private int a;
public void start() {
super.start();
Timer timer = new Timer(true);//把与Timer关联的线程设置为后台线程
TimerTask task = new TimerTask() {
@Override
public void run() {
}
};
timer.schedule(task, 10, 50);//设置定时任务
}
public void reset() {
a = 0;
}
public void run() {
for(int i = 0;i < 1000;i++) {
System.out.println(getName() + ": " + a++);
yield();
}
}
public static void main(String[] args) {
TimerTest timerTest = new TimerTest();
timerTest.start();
}
}
Timer类的schedule(TimerTask task, long delay, long period)方法用来设置定时器需要执行的任务。task表示任务,delay表示延迟执行的时间,perod表示每次执行任务的时间间隔。
timer.schedule(task, 10, 50);
表示定时器会在10毫秒后执行task任务,每隔50毫秒重复执行一次。