JUC学习之线程池

本文为看视频学习笔记,若有错误请指正,谢谢!

原先如果要用到线程,需要在使用的时候new一个线程出来,并且不需要使用之后,还要销毁

 new Thread(ticket,"1号窗口").start();

但是当任务数量较多的情况下,开发人员频繁的创建线程然后销毁线程的话,是非常耗费资源的,那么就有了线程池的概念。概念上与数据库连接池类似

线程池:提供了一个线程队列,队列中保存着等待状态的线程,只要有任务,线程就可以立马进行工作。这样子就避免了去创建与销毁线程的额外性能开销,提高了响应的速度
线程池的体系结构:
线程池也是在jdk1.5之后的java.util.concurrent包提供的,核心的接口是executor,线程的维护和调度的根接口
子接口:ExecutorService:线程池的主要接口
        实现类:ThreadPoolExecutor
        子接口:ScheduleExecutorService:负责线程的调度的接口

                  实现类:ScheduleThreadPoolService:继承了线程池的实现类ThreadPoolExecutor,又实现了ScheduleExecutorService接口,既具备线程池的功能又能调度线程

《JUC学习之线程池》

在实际的使用过程中,我们不需要继承或者是实现上述复杂的体系结构来使用线程池,而是使用一个工具类Executors,它提供了通常情况下能满足的线程池要求的方法:

ExecutorService newFixedThreadPool():创建古订大小的线程池,返回值是ExecutorService

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

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

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

public class TestThreadPool {

    public static void main(String[] args){
        //创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);

        ThreadPoolDemo threadPoolDemo = new ThreadPoolDemo();

        //给线程池中的线程分配任务
        for (int i = 0; i < 10; i++) {
            pool.submit(threadPoolDemo);
        }

        //关闭线程池 shutdown(),shutdownNow()
        pool.shutdown();
    }

}

class ThreadPoolDemo implements Runnable{

    private int num = 0;
    @Override
    public void run() {
        while (num <= 100){
            System.out.println(Thread.currentThread().getName()+":"+ num++);
        }
    }
}

以上是线程池中提交实现了Runnable的线程的写法,代码中涉及到了关闭线程池的方法shutdown()和shutdownNow()方法,其中,shutdown()方法是以一种平和的方式关闭线程池的,它会等待当前线程中线程执行完所有的任务之后才关闭线程池,期间如果有新的资源访问线程池,则不理会;而shutdownNow()则是立马关闭线程池,不论线程任务是否执行完毕。

运行结果:

《JUC学习之线程池》

线程池中提交继承了callable的线程的写法

public class TestThreadPool {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);

        List<Future<Integer>> list = new ArrayList<>();

        //给线程池中的线程分配任务
        for (int i = 0; i <10 ; i++) {
            Future<Integer> future = pool.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    int sum = 0;
                    for (int j = 0; j <= 100 ; j++) {
                        sum += j;
                    }
                    return sum;
                }
            });
            list.add(future);

        }

        //关闭线程池 shutdown(),shutdownNow()
        pool.shutdown();

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

}

运行结果:

《JUC学习之线程池》

线程调度:

public class TestThreadPool {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建线程池
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);

        //给线程池中的线程分配任务
        for (int i = 0; i < 10; i++) {
            Future<Integer> future = pool.schedule(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    int num = (int)new Random().nextInt(100);
                    System.out.println(Thread.currentThread().getName() + ":" +num);
                    return num;
                }
            },1,TimeUnit.SECONDS);
            System.out.println(future.get());
        }


        //关闭线程池 shutdown(),shutdownNow()
        pool.shutdown();
    }

对pool.schedule()这个方法的参数介绍,delay是long类型的数字,表明延迟的时间,unit是TimeUnit类型的数据,表明延迟时间的单位。
《JUC学习之线程池》
运行结果:间隔1秒输出
《JUC学习之线程池》

    原文作者:JUC
    原文地址: https://blog.csdn.net/dyt443733328/article/details/80051446
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞