首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >spring(基础三) spring定时任务+线池程实现

spring(基础三) spring定时任务+线池程实现

作者头像
Java架构师必看
发布2021-05-27 18:23:46
发布2021-05-27 18:23:46
3920
举报
文章被收录于专栏:Java架构师必看Java架构师必看

spring(基础三) spring定时任务+线池程实现

强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

1、定时任务中时间设置是这样的

代码语言:javascript
复制
<property name="delay" value="1000" />  
<!-- 每次任务间隔 5秒-->  
<property name="period" value="5000" />

在某些配置下某任务开始后还没执行完过了5秒,第二个任务又起来了。这与我的设计冲突。我希望任务是执行完后等5秒再进行第二个任务。

最后发现这个类可以

代码语言:javascript
复制
<bean id="springScheduleExecutorTask"  
    class="org.springframework.scheduling.concurrent.ScheduledExecutorTask">  
        <!-- 配置主任务 -->  
        <property name="runnable" ref="mainExecutor" />  
        <!-- 程序启动后延迟1秒执行第一次任务 -->  
        <property name="delay" value="1000" />  
        <!-- 每次任务间隔 5秒-->  
        <property name="period" value="5000" />  
</bean>

2、在主任务中我把小任务分放给线程池操作,必须要等线程池完成工作后才能结束主任务run

    如果起动线程池主任务run完毕,第二个任务5秒之后就运行了。我实现的代码是

代码语言:javascript
复制
//等待线程执行完毕  
  while(threadPool.getActiveCount() > 0){  
      try{  
         Thread.sleep(1000);  
      }catch(Exception e){  
          e.printStackTrace();  
      }  
   } 

3.完整实例

代码语言:javascript
复制
package com.my.task;  
import java.util.TimerTask;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;  
  
/** 
 *  
 * 主任务起动 
 * 
 * @author hao123 
 * @version 1.0 2010-7-29 
 */  
public class MainExecutor extends TimerTask {  
  
    private ThreadPoolTaskExecutor threadPool;  
      
    @Override  
    public void run() {  
        // TODO Auto-generated method stub  
        System.out.println("MainExecutor is start");  
        try{  
            Thread.sleep(5000);  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
        threadPool.execute(new MyTask(10));  
        threadPool.execute(new MyTask(10));  
        threadPool.execute(new MyTask(10));  
          
        //等待线程执行完毕  
        while(threadPool.getActiveCount() > 0){  
            try{  
                Thread.sleep(1000);  
            }catch(Exception e){  
                e.printStackTrace();  
            }  
        }          
        System.out.println("MainExecutor is end");           
    }  
  
    public ThreadPoolTaskExecutor getThreadPool() {  
        return threadPool;  
    }  
  
    public void setThreadPool(ThreadPoolTaskExecutor threadPool) {  
        this.threadPool = threadPool;  
    }  
  
    public static void main(String[] args) {  
        new ClassPathXmlApplicationContext(new String[]{"task.context.xml"});  
    }  
      
}  
代码语言:javascript
复制
package com.my.task;  
public class MyTask implements Runnable{   
    private int count;       
    public MyTask(int count){  
        this.count = count;  
    }  
      
    @Override  
    public void run() {  
        // TODO Auto-generated method stub       
        for(int i=0; i<count; i++){  
            System.out.println(Thread.currentThread().getName() + " : " + i);   
        }  
        System.out.println(Thread.currentThread().getName() + " end ");           
    }  
  
}  

配置文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "/spring-beans.dtd">  
<beans default-autowire="byName">  
  <bean id="springScheduledExecutorFactoryBean"  
        class="org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean">  
        <property name="scheduledExecutorTasks">  
            <list>  
                <ref bean="springScheduleExecutorTask" />  
            </list>  
        </property>  
    </bean>  
代码语言:javascript
复制
    <bean id="springScheduleExecutorTask"  
        class="org.springframework.scheduling.concurrent.ScheduledExecutorTask">           
        <property name="runnable" ref="mainExecutor" />         
        <property name="delay" value="1000" />  
        <!-- 每次任务间隔 5秒-->  
        <property name="period" value="5000" />  
    </bean>  
  
    <!-- 主任务 负责扫描任务 将任务分配给线程完成 -->  
    <bean id="mainExecutor"  
        class="com.my.task.MainExecutor">  
        <property name="threadPool" ref="threadPool" />  
    </bean>  
  
    <!-- 异步线程池 -->  
    <bean id="threadPool"  
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  
        <!-- 核心线程数  -->  
        <property name="corePoolSize" value="10" />  
        <!-- 最大线程数 -->  
        <property name="maxPoolSize" value="50" />  
        <!-- 队列最大长度 >=mainExecutor.maxSize -->  
        <property name="queueCapacity" value="1000" />  
        <!-- 线程池维护线程所允许的空闲时间 -->  
        <property name="keepAliveSeconds" value="300" />  
        <!-- 线程池对拒绝任务(无线程可用)的处理策略 -->  
        <property name="rejectedExecutionHandler">  
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>  
        </property>  
    </bean>    
</beans> 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档