zoukankan      html  css  js  c++  java
  • Executors中的几种线程调用方式

    一、Executors是java5以后提供的一套api,使用跟上面非常方便。Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要。 

    二、这里介绍Executors的4中线程池的用法

    1、newScheduledThreadPool(这种方式支持定时调度的方式,可以控制后台对于任务调度时间的把控)

      public static void initTask(){
            ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
            scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
                public void run() {
                    System.out.println("任务初始化======================任务初始化");
                    System.out.println(new Date());
                }
            },1,1,TimeUnit.MINUTES);
        }

    这里参数的是开始延迟1分钟执行,间隔时间1分钟,时间单元分钟。

    调度线程的方式适用于,正对于某些业务需要定时的去执行使用。

    2、newFixedThreadPool(这个是固定的线程池,可以设定固定的线程数)

      public static void doTask(){
            ExecutorService executorService = Executors.newFixedThreadPool(1);
            executorService.execute(new Runnable() {
                public void run() {
                    System.out.println("做任务=====================做任务");
                }
            });
        }

    这种线程只适用于单个任务或者需要多线程来支持的方式,因为线程池的数量是固定的,可以根据自己的需要提取使用

    3、newCachedThreadPool(这个方式比较灵活,缓存线程池。可以及时使用,及时回收,能够起到很好的保护作用)

      public static void cacheTask(){
            ExecutorService executorService = Executors.newCachedThreadPool();
            executorService.execute(new Runnable() {
                public void run() {
                    System.out.println("缓存任务=====================缓存任务");
                }
            });
    
        }

    4、newSingleThreadExecutor(这个方式相对简单,用于单线程的使用)

      public static void singleTask(){
            ExecutorService executorService = Executors.newSingleThreadExecutor();
            executorService.execute(new Runnable() {
                public void run() {
                    System.out.println("单线程任务=====================单线程任务");
                }
            });
    
        }

    上面几种方式就是Executors的使用

    newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
    newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
    newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

    三、我这里实现4中方式,效果是

    1、项目启动开始执行

    @Component
    public class ScheduleUtil implements ApplicationListener<ContextRefreshedEvent> {
    
        public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
            if (contextRefreshedEvent.getApplicationContext().getParent() == null) {
                System.out.println("开始任务======================开始任务");
                ScheduleTask.startTask();
                System.out.println("执行任务======================执行任务");
    
            }
        }
    }

    2、实现4中方式

    public class ScheduleTask {
    
        public static void startTask(){
            System.out.println("任务触发======================任务触发");
            initTask();
            doTask();
            cacheTask();
            singleTask();
        }
    
        public static void initTask(){
            ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
            scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
                public void run() {
                    System.out.println("任务初始化======================任务初始化");
                    System.out.println(new Date());
                }
            },1,1,TimeUnit.MINUTES);
        }
    
        public static void doTask(){
            ExecutorService executorService = Executors.newFixedThreadPool(1);
            executorService.execute(new Runnable() {
                public void run() {
                    System.out.println("做任务=====================做任务");
                }
            });
        }
    
        public static void cacheTask(){
            ExecutorService executorService = Executors.newCachedThreadPool();
            executorService.execute(new Runnable() {
                public void run() {
                    System.out.println("缓存任务=====================缓存任务");
                }
            });
    
        }
    
        public static void singleTask(){
            ExecutorService executorService = Executors.newSingleThreadExecutor();
            executorService.execute(new Runnable() {
                public void run() {
                    System.out.println("单线程任务=====================单线程任务");
                }
            });
    
        }
    }

    3、效果(这里除了调度任务外其他的都只执行一次)

    效果基本上就是这样

    上述的内容仅供参考!!!!!!!!!!

  • 相关阅读:
    基于jQuery的六大表单向导插件
    oracle行转列(动态行转不定列)
    PLSql自动替换---辅助写代码
    ExcelReport第一篇:使用ExcelReport导出Excel
    改HTML5里的input标签的required属性的提示为英文的
    spring boot:用redis+lua实现表单接口的幂等性(spring boot 2.2.0)
    linux(centos8):centos8.1安装(详细过程/图解)(vmware fusion/CentOS-8.1.1911-x86_64)
    linux(centos8):配置docker的cgroup driver为systemd
    linux(centos8):禁用selinux(临时关闭/永久关闭)
    linux(centos8):firewalld对于请求会选择哪个zone处理?
  • 原文地址:https://www.cnblogs.com/ll409546297/p/7238471.html
Copyright © 2011-2022 走看看