ScheduledExecutorService简化java多线程开发

2023-11-18 09:26:10 浏览数 (2)

前言

java开发,多多少少会接触到多线程的应用开发场景,博主之前做多线程的时候就两种方式,一个是继承Thread一个是实现Runnable接口,不过用的多的还是实现Runnable接口,因为实现Runnable接口可以做多线程资源共享!而java.util.concurrent.ScheduledExecutorService接口将大大简化多线程应用的开发!也能轻松解决任务定时执行的问题!

java多线程的应用场景

应用场景一:做过微信开发的都知道,微信的token是有失效时间的,而且每天获取token都是有限制的,不能每次需要的时候取一次,只能快过期的时候重新去取,这个时候我们就可以给取token的这个操作单独开个线程,每次取完后线程休眠一段继续去取,这样就保证了token永远都是有效的 !    

应用场景二:同样是微信开发中的问题,微信服务器连我们服务器的时候,必须五秒内响应结果,不然微信就直接提示用户,该服务不可用了。而我们不可能所有的业务都能做到五秒内完成并响应微信服务器。比如从微信服务器上下载用户提交的文件保存到我们自己的文件服务器上,(微信服务器临时保存用户文件),文件的上传下载都是比较耗时的操作,我们肯定不能等文件上传完了在响应微信,所有得单独开个线程还执行文件的下载上传操作 

应用场景三:................等等

ScheduledExecutorService方法简介

/**      *指定delay时间后执行任务      * @param command 执行的线程任务 Runnable不能返回执行结果      * @param delay 指定某个时间后执行      * @param unit 指定时间单位      * @return      */     public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) {         return null;     }     /**      *指定delay时间后执行任务      * @param callable 执行的线程任务 Callable返回执行结果      * @param delay 指定某个时间后执行      * @param unit 指定时间单位      * @param      * @return      */     publicScheduledFutureschedule(Callablecallable, long delay, TimeUnit unit) {         return null;     }     /**      *等待initiaDelay时间后,每个period时间执行一次      * @param command      * @param initialDelay      * @param period      * @param unit      * @return      */     public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {         return null;     }     //scheduleWithFixedDelay和scheduleAtFixedRate差不多     public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {         return null;     }

api详情可参考本站的在线jdk1.6文档:http://www.kailing.pub/java1.6-api 我的实例

代码语言:javascript复制
/**
 * @author kl by 2016/5/14
 * @boke www.kailing.pub
 */
public class Test  {
    public static int count=0;
    public static void main(String[] args) {
        //初始化两个线城池大小的任务调度服务
        ScheduledExecutorService executorService= Executors.newScheduledThreadPool(2);
        //任务一:0秒后开始执行,之后每秒执行一次
        final ScheduledFuture test1= executorService.scheduleAtFixedRate(new Runnable() {
            public void run() {
                System.out.println("任务一执行第" (count  ) "次   " Thread.currentThread());
            }
        },0, 1,TimeUnit.SECONDS);

        //任务二:6秒后开始执行,并返回执行结果
       final   ScheduledFuture test2 = executorService.schedule(new Callable() {
            public Object call()  {
                System.out.println("任务二执行,传递执行结果给任务三  " Thread.currentThread());
                return "任务二已执行完,请知晓!";
            }
        },6,TimeUnit.SECONDS);

        //任务三:8秒后执行,打印任务二的结果,终止任务一
        executorService.schedule(new Runnable() {
            public void run() {
                try {
                    System.out.println(test2.get());
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("任务三执行,任务一终止  " Thread.currentThread());
               test1.cancel(true);
            }
        },8,TimeUnit.SECONDS);

        System.out.println("我是最先执行的吗?不一定,虽然我是主线程  " Thread.currentThread());
    }
}

ps:因为任务三种涉及了任务二的执行结果,所以即使任务三的执行时间设置在任务二的执行前面,任务三也要等到任务二执行完后才能执行 ,这个可以修改执行时间自己测试测试,体会体会

我的实例结果

0 人点赞