Java并发编程-Executor框架之ScheduledThreadPoolExecutor

时间:2022-04-03 15:46:32

ScheduledThreadPoolExecutor是线程池执行器的一种,继承ThreadPoolExecutor,在ThreadPoolExecutor的基础上添加了按计划执行线程的功能,如延迟执行、定时执行、周期性执行。

还不了解Exector可以先查看Java并发编程-Executor框架:
http://blog.csdn.net/chenchaofuck1/article/details/51606224

使用方法:

  • 构造函数:使用Executors.newScheduledThreadPool(int corePoolSize),参数表示线程容量。

  • schedule(callable/runnable, delay,unit):第一个参数任务,第二个参数表示执行任务前等待的时间,第三参数表示时间单位。

  • scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit):第一个参数表示周期线执行的任务,第二个参数表示第一次执行前的延迟时间,第三个参数表示任务启动间隔时间,第四个参数表示时间单位。虽然任务类型是Runnable但该方法有返回值ScheduledFuture。可以通过该对象获取线程信息。

  • scheduleWithFixedDelay(Runnable command,long initialDelay,long period,TimeUnit unit):与scheduleAtFixedRate方法类似,不同的是第三个参数表示前一次结束的时间和下一次任务启动的间隔时间。

任务延时执行

使用schedule()设置每个任务比前一个任务延迟一秒执行:

public class ScheduledExecutorTest {
    public static void main(String[] args){
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
        for (int i = 0; i < 5; i++){            
            executor.schedule(new task(), 1+i, TimeUnit.SECONDS);       
        }
        executor.shutdown();
        while(!executor.isTerminated()){};

    }
    public static class task implements Runnable{
        @Override
        public void run()  {        
            String result=Thread.currentThread().getName()+":"+new Date().toString();
            System.out.println(result);                 
        }

    }
}

执行结果:

pool-1-thread-1:Wed Aug 10 15:39:38 CST 2016
pool-1-thread-3:Wed Aug 10 15:39:39 CST 2016
pool-1-thread-3:Wed Aug 10 15:39:40 CST 2016
pool-1-thread-3:Wed Aug 10 15:39:41 CST 2016
pool-1-thread-5:Wed Aug 10 15:39:42 CST 2016

任务周期性执行

使用scheduleAtFixedRate()方法每隔2秒启动一个线程,获取ScheduledFuture对象,通过该对象的getDelay()方法获取离下一次执行的时间。

public class ScheduledExecutorTest {
    public static void main(String[] args){
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
        task myTask=new task(); 
        ScheduledFuture<?> resultFuture=executor.scheduleAtFixedRate(myTask, 1, 2, TimeUnit.SECONDS);       
        for(int i=0;i<10;i++){       
            System.out.println(resultFuture.getDelay(TimeUnit.MILLISECONDS));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        };
        executor.shutdown();

    }
    public static class task implements Runnable{
        @Override
        public void run()  {        
            String result=Thread.currentThread().getName()+":"+new Date().toString();
            System.out.println(result);                 
        }

    }

}

执行结果:
pool-1-thread-1:Wed Jun 08 16:19:47 CST 2016
999
0
pool-1-thread-1:Wed Jun 08 16:19:49 CST 2016
999
0
pool-1-thread-2:Wed Jun 08 16:19:51 CST 2016
999
0
pool-1-thread-1:Wed Jun 08 16:19:53 CST 2016
999
0
pool-1-thread-3:Wed Jun 08 16:19:55 CST 2016