守护线程和定时器

2021-03-01 13:28

阅读:677

标签:demo   需要   数据   ace   结束   ati   proc   extends   垃圾   

Java中又两种线程:

  • 用户线程:普通的线程;
  • 守护线程:又可叫做后台线程,如垃圾回收线程。一般是死循环执行,等到所有的用户线程结束,守护线程就结束。

如:我们需要每天的00:00就进行数据的备份,这个时候我们就需要一个定时器线程,并且将该定时器线程设置为守护线程。

1.守护线程

守护线程是一直执行的,即死循环,当用户线程执行完毕时,守护线程也执行完毕。

如何设置线程为守护线程?

在线程启动前,setDaemon(true);

例:

package com.dh.daemon;

public class DaemonDemo {
    public static void main(String[] args) {
        MyThread t = new MyThread();
        t.setName("t1");
        //设置t为守护线程
        t.setDaemon(true);
        t.start();

        for (int i = 0; i "+i);
        }
    }
}

class MyThread extends Thread {
    int i = 0;
    @Override
    public void run() {
        //守护线程:死循环
        while (true){
            System.out.println(Thread.currentThread().getName()+"--->"+(++i));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

结果:

main--->0
t1--->1
main--->1
main--->2
main--->3
main--->4
main--->5
main--->6
main--->7
main--->8
main--->9

当main线程结束时,t1线程也结束了。若没有设置t1线程为守护线程,t1线程就会一直死循环运行。

2.定时器

定时器就是间隔特定的时间,做特定的事情。

sleep()就可以当作是定时器,但是很少使用,因为效率很低。

类库中已经帮我们定义好了一个java.util.Timer定时器类,可以直接使用:

void  schedule(TimerTask task, Date firstTime, long period) //从指定的时间开始,间隔指定的时间,做指定的事情
    //TimerTask task:要执行的任务(是一个抽象类,需要自己写一个任务类继承TimeTask)
    //Date firstTime:开始时间
    //long period:间隔时间(单位是毫秒)

以下书写一个定时输出日志到控制台的例子:

package com.dh.timer;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimerTest {
    public static void main(String[] args) throws ParseException {
        //创建定时器对象
        Timer timer = new Timer();
        //要实现的任务
        MyTask task = new MyTask();
        //开始时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = sdf.parse("2021-02-21 23:25 :00");
        timer.schedule(task, date, 1000 * 10);
    }
}

//任务类
class MyTask extends TimerTask {
    //重写run(),在run()中书写需要执行的操作
    @Override
    public void run() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = sdf.format(new Date());
        System.out.println(time + ":进行了日志输出!");
    }
}

结果:

2021-02-21 23:25:00:进行了日志输出!
2021-02-21 23:25:10:进行了日志输出!
2021-02-21 23:25:20:进行了日志输出!
2021-02-21 23:25:30:进行了日志输出!

Process finished with exit code -1

程序会一直运行,需要自己手动停止。

守护线程和定时器

标签:demo   需要   数据   ace   结束   ati   proc   extends   垃圾   

原文地址:https://www.cnblogs.com/denghui-study/p/14437953.html


评论


亲,登录后才可以留言!