栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Executors快速创建线程池以及管理线程池

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Executors快速创建线程池以及管理线程池

Executors快速创建线程以及管理线程池

文章目录
  • Executors快速创建线程以及管理线程池
  • 简介
  • Executors方法介绍
    • 1. newFixedThreadPool
    • 2. newSingleThreadExecutor
    • 3. newCachedThreadPool
    • 4. newScheduledThreadPool
    • 5. newWorkStealingPool


简介
  • Executors类属于java.util.concurrent包;
  • 线程池的创建分为两种方式:ThreadPoolExecutor 和 Executors;
  • Executors(静态Executor工厂)用于创建线程池;
  • 工厂和工具方法Executor , ExecutorService , ScheduledExecutorService , ThreadFactory和Callable在此包中定义的类;
Executors方法介绍
  • newFixedThreadPool(int nThreads) 数量固定的线程池
  • newSingleThreadExecutor() 单个线程的线程池
  • newCachedThreadPool() 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  • newScheduledThreadPool(int corePoolSize) 周期性任务线程池
  • newWorkStealingPool(int parallelism) 多个线程共有一个阻塞队列,而newWorkStealingPool 中每一个线程都有一个自己的队列,当线程发现自己的队列没有任务了,就会到别的线程的队列里获取任务执行。可以简单理解为”窃取“。
1. newFixedThreadPool
  • 数量固定的线程池
public class ExecutorsDemo {

    public static void print() {
        System.out.println(Thread.currentThread().getName() + ":执行了");
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        executorService.execute(() -> ExecutorsDemo.print());
        executorService.execute(() -> ExecutorsDemo.print());
        executorService.execute(() -> ExecutorsDemo.print());
        executorService.execute(() -> ExecutorsDemo.print());
    }
}
  • 效果
2. newSingleThreadExecutor
  • 单个线程线程池
public class ExecutorsDemo {

    public static void print() {
        System.out.println(Thread.currentThread().getName() + ":执行了");
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.execute(() -> ExecutorsDemo.print());
        executorService.execute(() -> ExecutorsDemo.print());
        executorService.execute(() -> ExecutorsDemo.print());
        executorService.execute(() -> ExecutorsDemo.print());
    }
}
  • 效果
3. newCachedThreadPool
  • 可缓存线程池
public class ExecutorsDemo {

    public static void print() {
        System.out.println(Thread.currentThread().getName() + ":执行了");
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(() -> ExecutorsDemo.print());
        executorService.execute(() -> ExecutorsDemo.print());
        executorService.execute(() -> ExecutorsDemo.print());
        executorService.execute(() -> ExecutorsDemo.print());
    }
}
  • 效果
4. newScheduledThreadPool
  • 执行定时性或周期性任务线程池
  • schedule 延迟任务
  • scheduleAtFixedRate 周期性任务,每1秒执行一次,不管当前任务是否结束
  • scheduleWithFixedDelay 周期性任务,直到任务停止后新的任务计时才开始
public class ExecutorsDemo {

    public static void print(String msg) {
            System.out.println(Thread.currentThread().getName() + ":" + msg);
    }

    public static void main(String[] args) {
        ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(4);
        // 延迟5秒执行
        scheduled.schedule(() -> ExecutorsDemo.print("延迟任务"), 5000, TimeUnit.MILLISECONDS);
        // 周期性执行,首次延迟5秒,之后每1秒执行一次,不管当前任务是否结束
        scheduled.scheduleAtFixedRate(() -> ExecutorsDemo.print("周期性任务1"), 5000, 1000, TimeUnit.MILLISECONDS);
        // 周期性执行,首次延迟5秒,直到任务停止后新的任务计时才开始,1秒后执行
        scheduled.scheduleWithFixedDelay(() -> ExecutorsDemo.print("周期性任务2"), 5000, 1000, TimeUnit.MILLISECONDS);
    }
}
5. newWorkStealingPool
  • 任务窃取线程池
public class ExecutorsDemo {

    public static void print(String msg) {
        System.out.println(Thread.currentThread().getName() + ":" + msg);
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newWorkStealingPool(4);
        executorService.execute(() -> ExecutorsDemo.print("任务1"));
        executorService.execute(() -> ExecutorsDemo.print("任务2"));
        executorService.execute(() -> ExecutorsDemo.print("任务3"));
        executorService.execute(() -> ExecutorsDemo.print("任务4"));
        // 由于线程是抢占式,必须保持程序不终止,否则可能导致线程抢不到任务程序就终止了
        while (true) {}
    }
}
  • 效果
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/959674.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号