目 录CONTENT

文章目录

13_JUC_线程池

ByteNews
2019-08-27 / 0 评论 / 0 点赞 / 8,902 阅读 / 1,763 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-01-16,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

13_JUC_线程池

为什么需要线程池?

传统用法:

/**
 * 线程池
 */
public class TestThreadPool {

    public static void main(String[] args) {
        new Thread(new ThreadPoolDemo(),"ThreadPoolDemo").start();
    }


}

class ThreadPoolDemo implements Runnable{

    private int i = 0;

    public void run() {
        while (i<=100){
            System.out.println(Thread.currentThread().getName()+":"+i++);
        }
    }
}

会带来频繁创建、销毁线程,非常耗费资源(类比数据库连接池);

线程池

线程池:提供了一个线程队列,队列中保存着所有等待状态的线程,因此避免了创建与销毁额外开销,提高了响应速度。

线程池的体系结构:

java.util.concurrent.Executor:负责线程的使用与调度的根接口;

  • ExecutorService 子接口:线程池的主要接口
    • ThreadPoolExecutor:线程池的实现类
    • ScheduledExecutorService:负责线程调度的子接口
      • ScheduledThreadPoolExecutor:继承了ThreadPoolExecutor并实现了ScheduledExecutorService;

Executors工具类

ExecutorService newFixedThreadPool():创建固定大小的线程池

ExecutorService newCachedThreadPool():缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量

ExecutorService newSingleThreadExecutor():创建单个的线程池。线程池中只有一个线程

ScheduledExecutorService newScheduledThreadPool():创建固定大小的线程池,还可以延迟或者定时的执行任务。

/**
 * 线程池
 */
public class TestThreadPool {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        // 1. 创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);
        List<Future<Integer>> list = new ArrayList<Future<Integer>>();
        for (int i=0;i<10;i++) {
            Future<Integer> future = pool.submit(new Callable<Integer>() {
                public Integer call() throws Exception {
                    int sum = 0;
                    for (int i = 0; i <= 100; i++) {
                        sum += i;
                    }
                    return sum;
                }
            });
            list.add(future);
        }

        for (Future<Integer> future : list) {
            System.out.println("future.get() = " + future.get());
        }

        ThreadPoolDemo tpd = new ThreadPoolDemo();
        // 2. 为线程池中的线程分配任务
        for (int i=0;i<10;i++) {
            pool.submit(tpd);
        }
        // 3. 关闭线程池
        // 平和的方式关闭
        pool.shutdown();
        // 暴力关闭
//        pool.shutdownNow();

    }


}

class ThreadPoolDemo implements Runnable{

    private int i = 0;

    public void run() {
        while (i<=100){
            System.out.println(Thread.currentThread().getName()+":"+i++);
        }
    }
}
0

评论区