Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.3k views
in Technique[技术] by (71.8m points)

Spring的定时任务<task:scheduled-tasks>问题

请问一下有一个定时任务Task每3秒钟执行一次,在这个定时任务的for循环里创建A,每次开启一个线程将A丢进去,A继承Runnable接口,run方法运行10s

<bean id="timerATask" class="xxxxxx.A"></bean>
    <task:scheduled-tasks>
        <task:scheduled ref="timerATask" method="task" cron="*/3 * * * * ?"/>
    </task:scheduled-tasks>

有两个问题
1.每次循环是不是taskExecutor.execute(t1);执行完就会执行下一次for循环,和新开启线程内的run方法是否被执行结束没关系吧
2.for循环1000次执行完成后,但是run方法中的执行时间为10s是超过3s的没有执行完,定时任务到3s的时候还会继续执行吗,还是说等所有run方法结束后等3s才执行


public class Task {
    private static Logger logger = LoggerFactory.getLogger(Task.class);
    @Resource(name = "taskExecutor")
    private TaskExecutor taskExecutor;
    public void task() {
        logger.info("==========开始执行定时任务==========");
            for (int x = 0; x < 1000; x++) {
            try {
                        A a = new A(x);
                        Thread t1 = new Thread(a);
                        taskExecutor.execute(t1);

             } catch (Exception e) {
             }
        }
    }

public class A implements Runnable {
    private int x;
    public void run() {
        System.out.println(this.x);
        /* 逻辑处理执行时间10s     */
    }
    public A(int x) {
        this.x = x;
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

说实话,你这题提的很迷糊,到底是for里面是定时任务,还是整个for是一个定时任务,看你声明就是乱的,A哪有task方法???
个人猜测你需要的答案,整个for是一个定时器任务。
1.从多线程的角度,不考虑定时器,没有任何关系。
2.这个看你用哪种框架,ScheduledExecutorService 就有关系,特别说明了不会同时执行一个任务,而quartz,就可以同时执行一个任务,你任务花多少时间他不管,只要线程池够用就行。但从cron表达式上来说,除了资源外,任务之间是不存在依赖关系的,同一个任务也是如此,ScheduledExecutorService 也没有说明是cron任务


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...