Java ScheduledThreadPoolExecutor示例

时间:2020-02-23 14:35:10  来源:igfitidea点击:

有多种方法可以在Java中安排任务。
我们已经拥有Java Timer来安排任务,但定时器任务的问题是我们可以一次执行一个任务。

因此,如果当前任务需要更长时间的作业将会延迟。

在这种情况下,我们可以使用Java ScheduledThreadPoolExecutor.This类是executor框架的一部分,并提供设施来安排任务而不是立即执行它。
我们可以使用三种方法使用scheduledThreadPoolExecutor计划任务。

  • schedule
  • scheduleatfixedrate.
  • schedulewithfixeddelay.

Java ScheduledThreadPoolExecutor示例:

第1步:创建一个名为"runnableTask.java"的runnable任务。

package org.igi.theitroad;
 
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步:

package org.igi.theitroad;
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");
	}
}

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

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);

ScheduledThreadPoolExecutor还有工厂方法名为NewscheduledThreadPool的Experutors类类似于NewFixedThreadPoolExecutor和NewCachedThreadPoolexectuor。
我们需要将计划方法调用为任务安排。
计划方法需要三个参数:

public ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit):

Runnable命令:它表示要计划的任务。
长期延迟:它代表我们要安排任务的初步延迟。
时间单位:它是延迟参数的时间措施。
如果我们注意到,计划方法返回ScheduledFuture<?>的对象。我们可以用它获取提交作业的状态。

我们也称为scheduledthreadpool.shutdown(),shutdown()方法将bydefault等待提交的任务来执行,然后终止。
我们可以使用setExecuteexistingDelayedTaskSaftersHutdownPolicy()更改此策略。

运行上面的程序时,我们将得到以下输出:

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

scheduledthreadpootexecutor的scheduleatfixedrate示例:

ScheduledThreadPoolExecutor的ScheduleAtFixEdrate用于在修复延迟后计划任务,然后定期执行该任务。
scheduleatfixedrate方法需要四个参数:

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit)

Runnable命令:它代表要计划的任务。
long initialdelay:它代表了要安排任务的初始延迟。
长期:它代表我们要重复任务的时间。
时间单位:它是延迟参数的时间措施。
让我们在ScheduledThreadPoolMain中调用scheduleatfixedrate的一些更改。

package org.igi.theitroad;
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 Jan 19 00:56:29 IST 2016
pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:56:36 IST 2016
pool-1-thread-2 Start Time for Task 2 Fri Jan 19 00:56:38 IST 2016
pool-1-thread-3 Start Time for Task 3 Fri Jan 19 00:56:40 IST 2016
pool-1-thread-1 End Time for Task 1 Fri Jan 19 00:56:41 IST 2016
pool-1-thread-2 End Time for Task 2 Fri Jan 19 00:56:43 IST 2016
pool-1-thread-3 End Time for Task 3 Fri Jan 19 00:56:45 IST 2016
pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:56:46 IST 2016
pool-1-thread-2 Start Time for Task 2 Fri Jan 19 00:56:48 IST 2016
pool-1-thread-3 Start Time for Task 3 Fri Jan 19 00:56:50 IST 2016
pool-1-thread-1 End Time for Task 1 Fri Jan 19 00:56:51 IST 2016
pool-1-thread-2 End Time for Task 2 Fri Jan 19 00:56:53 IST 2016
pool-1-thread-3 End Time for Task 3 Fri Jan 19 00:56:55 IST 2016
Completed all threads

如果仔细观察输出:

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

一旦任务1开始,下一个任务计划在ScheduleAtFixedRate方法中提供的10秒之后。

scheduledthreadpootexecutor的schedulewithfixeddelay示例:

ScheduledThreadPoolExecutor的SchedulewithFixedDelay用于在初始延迟后计划任务,然后在完成上一个任务完成后使用固定延迟执行任务。
让我们在ScheduledThreadPoolMain中调用schedulewithfixeddelay进行一些更改。

package org.igi.theitroad;
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 Jan 19 00:20:39 IST 2016
Current Time = Fri Jan 19 00:50:53 IST 2016
pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:51:00 IST 2016
pool-1-thread-2 Start Time for Task 2 Fri Jan 19 00:51:02 IST 2016
pool-1-thread-3 Start Time for Task 3 Fri Jan 19 00:51:04 IST 2016
pool-1-thread-1 End Time for Task 1 Fri Jan 19 00:51:05 IST 2016
pool-1-thread-2 End Time for Task 2 Fri Jan 19 00:51:07 IST 2016
pool-1-thread-3 End Time for Task 3 Fri Jan 19 00:51:09 IST 2016
pool-1-thread-1 Start Time for Task 1 Fri Jan 19 00:51:15 IST 2016
pool-1-thread-2 Start Time for Task 2 Fri Jan 19 00:51:17 IST 2016
pool-1-thread-3 Start Time for Task 3 Fri Jan 19 00:51:19 IST 2016
pool-1-thread-1 End Time for Task 1 Fri Jan 19 00:51:20 IST 2016
pool-1-thread-2 End Time for Task 2 Fri Jan 19 00:51:22 IST 2016
pool-1-thread-3 End Time for Task 3 Fri Jan 19 00:51:24 IST 2016
Completed all threads

如果仔细观察输出:

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

一旦任务1结束,下一个任务在延迟延迟10秒之后,它在SchedulewithfixedDelay方法提供了10秒之后。