守护线程:
java语言中线程分为两大类:用户线程守护线程(后台线程)
守护线程:其中具有代表性的就是垃圾回收线程
守护线程特点:一般守护线程是一个死循环,所有的用户线程只要结束,守护线程自动结束,即使守护线程为死循环
主线程main方法是一个用户线程
守护线程用在什么地方:
每天0点的时候系统自动备份,需要使用到定时器,并且我们可以将定时器设置为守护线程
setDaemon
public class Test_11 {
public static void main(String[] args) {
Thread t1 = new Thread(new MyThread11());
t1.setDaemon(true);
t1.start();
for (int i = 0; i < 10; i++){
System.out.println(Thread.currentThread().getName() + "---->" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("main over");
}
}
class MyThread11 implements Runnable{
@Override
public void run() {
/*for (int i = 0; i < 20; i++){
System.out.println(Thread.currentThread().getName() + "--->" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}*/
int i = 0;
while (true){
System.out.println(Thread.currentThread().getName() + "--->" + i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
定时器:
间隔特定的时间执行特定的程序sleep也可以实现这种功能
java.util.Timer,不过在实际开发中也较少使用,因为现在很多高级框架支持定时任务
Spring框架提供的SpringTask框架,底层实际是定时器
Timer timer = new Timer()
Timer(true)
timer.schedule(定时任务,第一次执行时间,间隔多久执行一次)
编写一个定时任务类继承TimerTask,重写run方法可以使用匿名内部类方式
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Test_12 {
public static void main(String[] args) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String time = "2020-8-10 10:31:00 000";
try {
Date date = simpleDateFormat.parse(time);
Timer timer = new Timer();
// Timer timer1 = new Timer(true);
Task task = new Task();
timer.schedule(task, date, 1000*10);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
class Task extends TimerTask {
int i = 0;
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "--->" + i++);
}
}