Executors中的几种线程调用方式

简介: 一、Executors是java5以后提供的一套api,使用跟上面非常方便。Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。

一、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、效果(这里除了调度任务外其他的都只执行一次)

效果基本上就是这样

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

 

相关文章
|
6月前
|
缓存 安全 Java
多线程线程池问题之为什么手动创建的线程池比使用Executors类提供的线程池更安全
多线程线程池问题之为什么手动创建的线程池比使用Executors类提供的线程池更安全
|
7月前
|
缓存 并行计算 Java
重温JAVA线程池精髓:Executor、ExecutorService及Executors的源码剖析与应用指南
重温JAVA线程池精髓:Executor、ExecutorService及Executors的源码剖析与应用指南
|
7月前
|
存储 缓存 Java
如何创建一个线程池,为什么不推荐使用Executors去创建呢?
【6月更文挑战第2天】如何创建一个线程池,为什么不推荐使用Executors去创建呢?
48 1
|
8月前
|
Java API 开发者
为什么禁止使用Executors创建线程池?
【5月更文挑战第5天】`Executors`类在Java中广泛用于创建线程池,但建议避免使用,因其线程池大小固定,不适用于所有场景;线程池生命周期管理不便,无法优雅关闭;异常处理机制不足,抛出的未检查异常会被忽略,影响调试;且资源管理较为手动,增加代码复杂性。尽管如此,对于简单应用和原型设计,`Executors`仍有其价值。在复杂情况下,推荐使用更灵活的`ThreadPoolExecutor`。
83 1
|
缓存 Java p3c
【Java用法】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
【Java用法】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
205 0
|
8月前
|
Java
Executors创建线程池
Executors创建线程池
|
8月前
|
存储 Java 开发者
为什么建议不要使用Executors来创建线程池?
为什么建议不要使用Executors来创建线程池?
68 0
|
8月前
|
安全 Java
线程池初始化严禁使用Executors
线程池初始化严禁使用Executors
|
Java
Java 利用JUC CountDownLatch 线程池Executors 实现多线程操作
Java 利用JUC CountDownLatch 线程池Executors 实现多线程操作 业务场景:某个业务操作非常耗时,但又必须等这个操作结束后才能进行后续操作
79 0
ThreadPoolExecutor的中的submit和FutureTask || 通过Executors 创建线程池的一些实例(Callable和Runnable的在其中的体现)
ThreadPoolExecutor的中的submit和FutureTask || 通过Executors 创建线程池的一些实例(Callable和Runnable的在其中的体现)
222 0