JUC学习之线程池

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

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

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

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

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

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


在实际的使用过程中,我们不需要继承或者是实现上述复杂的体系结构来使用线程池,而是使用一个工具类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学习之线程池_第1张图片

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

public class TestThreadPool {

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

        List> list = new ArrayList<>();

        //给线程池中的线程分配任务
        for (int i = 0; i <10 ; i++) {
            Future future = pool.submit(new Callable() {
                @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 future:list) {
            System.out.println(future.get());
        }
    }

}

运行结果:

JUC学习之线程池_第2张图片


线程调度:

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 future = pool.schedule(new Callable() {
                @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学习之线程池_第3张图片
运行结果:间隔1秒输出
JUC学习之线程池_第4张图片

你可能感兴趣的:(JUC)