Java ScheduledThreadPoolExecutor 示例

有多种方法可以在 java 中安排任务。我们已经有Java timer来安排任务,但是 timers 任务的问题是您一次只能执行一个任务。因此,如果当前任务需要更长的时间,后续作业将被延迟。

在这种情况下,您可以使用 Java ScheduledThreadPoolExecutor。这个类是 Executor 框架的一部分,它提供了安排任务而不是立即执行任务的工具。
您可以使用三种方法来使用 ScheduledThreadPoolExecutor 来安排任务。

Java ScheduledThreadPoolExecutor 示例:

第 1 步:创建一个名为“RunnableTask.java”的可运行任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
package org.arpit.java2blog;
 
import java.util.Date;
 
public class RunnableTask implements Runnable{
 
private String taskName;
 
    public RunnableTask(String s){
        this.taskName=s;
    }
 
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+" Start Time for "+taskName+" "+new Date());
        // Process task here
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+" End Time for "+taskName+" "+new Date());
    }
 
    @Override
    public String toString(){
        return this.taskName;
    }
}
 

第2步:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
package org.arpit.java2blog;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
 
public class ScheduledThreadPoolMain {
 
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Current Time = "+new Date());
        // Created ScheduledThreadPoolExecutor object
 
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
 
        for(int i=1; i<=3; i++){
            Thread.sleep(2000);
            RunnableTask task = new RunnableTask("Task "+i);
            scheduledThreadPool.schedule(task,5, TimeUnit.SECONDS);
        }
 
        // Adding some delay
        Thread.sleep(10000);
 
        scheduledThreadPool.shutdown();
        System.out.println("Completed all threads");
    }
}
 

让我们更多地了解上述主要方法。

1
2
3
 
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
 

ScheduledThreadPoolExecutor 在 Executors 类中也有名为 newScheduledThreadPool 的工厂方法,类似于 newFixedThreadPoolExecutor 和 newCachedThreadPoolExectuor。
您需要调用 schedule 方法来安排任务。
schedule 方法接受三个参数:
public Sc​​heduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit):
Runnable command:表示要调度的任务。
长时间延迟:它表示您要安排任务的初始延迟。
TimeUnit 单位:延迟参数的时间度量。
如果您注意到,schedule 方法会返回 ScheduledFuture<?> 的对象,您可以使用它来获取已提交作业的状态。

我们也调用了scheduledThreadPool.shutdown(),shutdown()方法默认会等待提交的任务执行然后终止。您可以使用 setExecuteExistingDelayedTasksAfterShutdownPolicy() 更改此策略。

当你运行上面的程序时,你会得到下面的输出:

Current Time = Fri May 19 00:20:39 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:20:46 IST 2017
pool-1-thread-2 Start Time for Task 2 Fri May 19 00:20:48 IST 2017
pool-1-thread-3 Start Time for Task 3 Fri May 19 00:20:50 IST 2017
pool-1-thread-1 End Time for Task 1 Fri May 19 00:20:51 IST 2017
pool-1-thread-2 End Time for Task 2 Fri May 19 00:20:53 IST 2017
pool-1-thread-3 End Time for Task 3 Fri May 19 00:20:55 IST 2017
Completed all threads

ScheduledThreadPoolExecutor 的 scheduleAtFixedRate 示例:

ScheduledThreadPoolExecutor 的 scheduleAtFixedRate 用于在修复延迟后调度任务,然后定期执行该任务。
scheduleAtFixedRate 方法有四个参数:
public Sc​​heduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit)
Runnable command:表示要调度的任务。
long initialDelay:它表示您要安排任务的初始延迟。
长周期:它表示您要重复任务的周期。
TimeUnit 单位:延迟参数的时间度量。
让我们做一些更改来调用 ScheduledThreadPoolMain 中的 scheduleAtFixedRate。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
package org.arpit.java2blog;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
 
public class ScheduledThreadPoolMain {
 
    /**
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Current Time = "+new Date());
        // Created ScheduledThreadPoolExecutor object
 
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
 
        for(int i=1; i<=3; i++){
            Thread.sleep(2000);
            RunnableTask task = new RunnableTask("Task "+i);
            scheduledThreadPool.scheduleAtFixedRate(task,5,10,TimeUnit.SECONDS);
        }
 
        // Adding some delay
        Thread.sleep(15000);
 
        scheduledThreadPool.shutdown();
        while(!scheduledThreadPool.isTerminated()){
            //wait for all tasks to finish
        }
        System.out.println("Completed all threads");
    }
}
 

当你运行上面的程序时,你会得到下面的输出:

Current Time = Fri May 19 00:56:29 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:56:36 IST 2017
pool-1-thread-2 Start Time for Task 2 Fri May 19 00:56:38 IST 2017
pool-1-thread-3 Start Time for Task 3 Fri May 19 00:56:40 IST 2017
pool-1-thread-1 End Time for Task 1 Fri May 19 00:56:41 IST 2017
pool-1-thread-2 End Time for Task 2 Fri May 19 00:56:43 IST 2017
pool-1-thread-3 End Time for Task 3 Fri May 19 00:56:45 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:56:46 IST 2017
pool-1-thread-2 Start Time for Task 2 Fri May 19 00:56:48 IST 2017
pool-1-thread-3 Start Time for Task 3 Fri May 19 00:56:50 IST 2017
pool-1-thread-1 End Time for Task 1 Fri May 19 00:56:51 IST 2017
pool-1-thread-2 End Time for Task 2 Fri May 19 00:56:53 IST 2017
pool-1-thread-3 End Time for Task 3 Fri May 19 00:56:55 IST 2017
Completed all threads

如果仔细观察输出:

pool-1-thread-1 Start Time for Task 1 Fri May 19 00:56:36 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:56:46 IST 2017

一旦任务 1 开始,下一个任务会在 scheduleAtFixedRate 方法中提供的 10 秒后安排。

ScheduledThreadPoolExecutor 的 scheduleWithFixedDelay 示例:

ScheduledThreadPoolExecutor 的 scheduleWithFixedDelay 用于在初始延迟后调度一个任务,然后在前一个任务完成后以固定延迟执行任务。
让我们做一些更改来调用 ScheduledThreadPoolMain 中的 scheduleWithFixedDelay。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
package org.arpit.java2blog;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
 
public class ScheduledThreadPoolMain {
 
    /**
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Current Time = "+new Date());
        // Created ScheduledThreadPoolExecutor object
 
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
 
        for(int i=1; i<=3; i++){
            Thread.sleep(2000);
            RunnableTask task = new RunnableTask("Task "+i);
            scheduledThreadPool.scheduleWithFixedDelay(task,5,10,TimeUnit.SECONDS);
        }
 
        // Adding some delay
        Thread.sleep(30000);
 
        scheduledThreadPool.shutdown();
        while(!scheduledThreadPool.isTerminated()){
            //wait for all tasks to finish
        }
        System.out.println("Completed all threads");
    }
}
 

Current Time = Fri May 19 00:20:39 IST 2017
Current Time = Fri May 19 00:50:53 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:51:00 IST 2017
pool-1-thread-2 Start Time for Task 2 Fri May 19 00:51:02 IST 2017
pool-1-thread-3 Start Time for Task 3 Fri May 19 00:51:04 IST 2017
pool-1-thread-1 End Time for Task 1 Fri May 19 00:51:05 IST 2017
pool-1-thread-2 End Time for Task 2 Fri May 19 00:51:07 IST 2017
pool-1-thread-3 End Time for Task 3 Fri May 19 00:51:09 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:51:15 IST 2017
pool-1-thread-2 Start Time for Task 2 Fri May 19 00:51:17 IST 2017
pool-1-thread-3 Start Time for Task 3 Fri May 19 00:51:19 IST 2017
pool-1-thread-1 End Time for Task 1 Fri May 19 00:51:20 IST 2017
pool-1-thread-2 End Time for Task 2 Fri May 19 00:51:22 IST 2017
pool-1-thread-3 End Time for Task 3 Fri May 19 00:51:24 IST 2017
Completed all threads

如果仔细观察输出:

pool-1-thread-1 End Time for Task 1 Fri May 19 00:51:05 IST 2017
pool-1-thread-1 Start Time for Task 1 Fri May 19 00:51:15 IST 2017

一旦任务 1 结束,下一个任务会在 scheduleWithFixedDelay 方法中提供的 10 秒延迟后安排。

这就是 Java ScheduledThreadPoolExecutor 示例的全部内容。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值