Spingboot定时任务与多线程

1.第一种@EnableScheduling 注解

定时执行

package com.neo;

import java.io.File;

import org.apache.log4j.PropertyConfigurator;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.web.servlet.ErrorPage;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.scheduling.annotation.EnableScheduling;

import com.neo.utils.PathUtils;

@SpringBootApplication
@EnableScheduling           //添加定时任务
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }   
}
/**
 * @author lcc
 * @time 2018-06-17
 * @desc 定时任务
 */
@Component
public class TimeTask {

     /* cron表达式中各时间元素使用空格进行分割,分别表示如下含义:
        按顺序依次为
        秒(0~59)
        分钟(0~59)
        小时(0~23)
        天(月)(0~31,但是你需要考虑你月的天数)
        月(0~11)
        天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
        7.年份(1970-2099)*/

    //每天中午12点触发   去删除数据库中已经删除的留言信息
    @Scheduled(cron="5/10 * * * * ?")
    public void onApplicationEvent() {
       RoadShowTask RoadShowTask = new RoadShowTask("aa");
               RoadShowTask.start();
        System.out.println("aa");

    }
}

public class RoadShowTask extends Thread{

    static Logger logger= LoggerFactory.getLogger(RoadShowTask.class);

    private String name;
    public RoadShowTask(String name) {
        this.name=name;
    }
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(name + "运行  :  " + i + "  线程池 ==>"+Thread.currentThread().getName().toString()+" ==> "+Thread.currentThread().toString());
            try {
                sleep((int) Math.random() * 10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        Thread.currentThread().interrupt();
    }
}

执行结果

aa
aa运行  :  0  线程池 ==>Thread-6 ==> Thread[Thread-6,5,main]
aa运行  :  1  线程池 ==>Thread-6 ==> Thread[Thread-6,5,main]
aa运行  :  2  线程池 ==>Thread-6 ==> Thread[Thread-6,5,main]
aa运行  :  3  线程池 ==>Thread-6 ==> Thread[Thread-6,5,main]
aa运行  :  4  线程池 ==>Thread-6 ==> Thread[Thread-6,5,main]
aa
aa运行  :  0  线程池 ==>Thread-7 ==> Thread[Thread-7,5,main]
aa运行  :  1  线程池 ==>Thread-7 ==> Thread[Thread-7,5,main]
aa运行  :  2  线程池 ==>Thread-7 ==> Thread[Thread-7,5,main]
aa运行  :  3  线程池 ==>Thread-7 ==> Thread[Thread-7,5,main]
aa运行  :  4  线程池 ==>Thread-7 ==> Thread[Thread-7,5,main]
aa
aa运行  :  0  线程池 ==>Thread-8 ==> Thread[Thread-8,5,main]
aa运行  :  1  线程池 ==>Thread-8 ==> Thread[Thread-8,5,main]
aa运行  :  2  线程池 ==>Thread-8 ==> Thread[Thread-8,5,main]
aa运行  :  3  线程池 ==>Thread-8 ==> Thread[Thread-8,5,main]
aa运行  :  4  线程池 ==>Thread-8 ==> Thread[Thread-8,5,main]

这种每次new一个线程,感觉太low


/**
 * @author lcc
 * @time 2018-06-17
 * @desc 定时任务
 */
@Component
public class TimeTask {

    private static ExecutorService executors = Executors.newFixedThreadPool(2, ThreadFactoryUtil.newFactory("Roadshow_Listener_"));
    @Scheduled(cron="5/10 * * * * ?")
    public void onApplicationEvent() {

        RoadShowTask RoadShowTask = new RoadShowTask("aa");
        executors.submit(RoadShowTask);
//        RoadShowTask RoadShowTask = new RoadShowTask("aa");
//        RoadShowTask.start();
        System.out.println("aa");
    }
}

修改上面的代码,改成线程池运行,这种相当于executors生成了2个线程,但是没有任务,而executors.submit(RoadShowTask);相当于把new的线程放到线程池里运行。
结果

aa
aa运行  :  0  线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行  :  1  线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行  :  2  线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行  :  3  线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行  :  4  线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa
aa运行  :  0  线程池 ==>Roadshow_Listener_2 ==> Thread[Roadshow_Listener_2,5,main]
aa运行  :  1  线程池 ==>Roadshow_Listener_2 ==> Thread[Roadshow_Listener_2,5,main]
aa运行  :  2  线程池 ==>Roadshow_Listener_2 ==> Thread[Roadshow_Listener_2,5,main]
aa运行  :  3  线程池 ==>Roadshow_Listener_2 ==> Thread[Roadshow_Listener_2,5,main]
aa运行  :  4  线程池 ==>Roadshow_Listener_2 ==> Thread[Roadshow_Listener_2,5,main]
aa
aa运行  :  0  线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行  :  1  线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行  :  2  线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行  :  3  线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行  :  4  线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]

2.集继承ApplicationListener

spring 项目加载完立刻执行

@SpringBootApplication
@EnableScheduling            //添加定时任务
public class ManagerApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = null;
        try {
            long start = System.currentTimeMillis();
            SpringApplication sa = new SpringApplication(ManagerApplication.class);
            // 注册监听器  定时任务 这里还必须new放到里面
            sa.addListeners(new RoadShowStatusListener());
            ctx = sa.run(args);
        } catch (Exception e) {
            LOGGER.error("Application start error:", e);
            System.exit(-1);
        } finally {
            if (ctx != null) {
                ctx.close();
            }
        }
    }
}
public class RoadShowStatusListener implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.print("aa");
    }

猜你喜欢

转载自blog.csdn.net/qq_21383435/article/details/80720460
今日推荐