springboot ThreadPoolTaskScheduler线程池大小设置实验

妖精的绣舞 提交于 2020-12-22 19:56:01
@Configuration("asynTimerTaskController")
@Scope(value ="prototype")  //为什么用了prototype之后,@autowired的threadPoolTaskScheduler就不能创建了????

public class AsynTimerTaskController {

//    @Autowired
//    @Resource
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;
//    @PostConstruct
//    public void initpool()
//    {
//        threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
//    }
    @Bean(name = "threadPoolTaskScheduler")     //(initMethod = "initpool")
//    @Scope(scopeName = "prototype")
    public ThreadPoolTaskScheduler threadPoolTaskScheduler()
    {
        threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(2);
        return threadPoolTaskScheduler;
    }

    //在ScheduledFuture中有一个cancel方法可以停止定时任务 要看源码
    private ScheduledFuture<?> future;

    public String start( Runnable runnable,long period)
    {
        if(threadPoolTaskScheduler == null)
            threadPoolTaskScheduler = ApplicationContextProvider.getBean("threadPoolTaskScheduler", ThreadPoolTaskScheduler.class);
//            threadPoolTaskScheduler = threadPoolTaskScheduler(); //这种做法,下一句就异常了
        future = threadPoolTaskScheduler.scheduleAtFixedRate(runnable,period);//500ms
        return "startok";
    }
    public String stop()
    {
        if(future!=null)
            future.cancel(true);
        return "stopok";
    }

    public String edit(Runnable runnable,long period)
    {
        stop();
        future = threadPoolTaskScheduler.scheduleAtFixedRate(runnable,period);
        return "editok";
    }

    public void destry()
    {
        System.out.println("AsynTimerTaskController.....destry......");
    }
}

原来的代码中没有threadPoolTaskScheduler.setPoolSize(2);这一句,因为是prototype,所以是多实例的。做实验的时候,有一个定时器(这是这个定时类的一个实例,名称为A吧),定时器的任务中再获取一个AsynTimerTaskController实例B,结果发现B中的任务无法运行,后来将setPoolSize这句加上之后一切正常了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!