JAVA周期线程池newScheduledThreadPool实现定时任务
首先、需要先编写需要使用周期线程池的业务方法,这里定义了一个简单的查询方法
public interface ZwxService { @Override public List<Zwxtestb> selectAllB() { List<Zwxtestb> zwxtestbList = new CopyOnWriteArrayList<>(); try { zwxtestbList = zwxMapper.selectAllB(); } catch (Exception e) { e.printStackTrace(); } return zwxtestbList; } }
第二步、编写一个线程CycleThreadForpools供周期线程池调用
public class CycleThreadForpools implements Runnable { /** * 日志 */ private static Logger LOGGER = Logger.getLogger(CycleThreadForpools .class); /** * 调用业务层 */ private ZwxService zwxService; /** * 将zwxService以及你需要的参数注入线程池 */ public CycleThreadForpools(ZwxService zwxService) { this.zwxService = zwxService; } /** * 编写业务或方法 */ public void business() { zwxService.selectAllB(); } @Override public void run() { try { LOGGER.info("进入有返回值,有参数线程" + Thread.currentThread().getName()); // 调用business方法 business(); Thread.sleep(1000); }catch (Exception e){ e.printStackTrace(); } } }
第三步 、编写周期线程池调用线程
@Component public class CycleScheduled { private static Logger LOGGER = Logger.getLogger(CycleScheduled.class); @Autowired private ZwxService zwxService; /** * 每次提交一个任务就提交一个线程,直到线程达到线城池大小,就不会创建新线程了 * 线程池的大小达到最大后达到稳定不变,如果一个线程异常终止,则会创建新的线程 * 参数根据实际业务进行编写 * / public void getCycleScheduled(){ //创建线程池 ScheduledExecutorService newScheduledThreadPool= Executors.newScheduledThreadPool(2); // 调用自己业务类 CycleThreadForpools cycleThreadForpools=new CycleThreadForpools(zwxService); // 参数的含义依次为:执行线程、初始化延时、线程调用时间间隔、计时单位 newScheduledThreadPool.scheduleAtFixedRate(cycleThreadForpools,10,10,TimeUnit.SECONDS); LOGGER.info("固定数量的线程池已关闭"); } }
最后、在Controller调用线程池,实现定时周期任务
@Resource private CycleScheduled cycleScheduled; @RequestMapping("guest/findAll") public String findAll() { long start = System.currentTimeMillis(); try { cycleScheduled.getCycleScheduled(); long end = System.currentTimeMillis(); LOGGER.info("查询成功,共计消耗时间:" + (end - start) / 1000); } catch (Exception e) { e.printStackTrace(); } return "Sussce"; }
以此方式,调用接口后,会在10s后调用该任务,并每间隔10s调用一次
上一篇:
IDEA上Java项目控制台中文乱码