本文为看视频学习笔记,若有错误请指正,谢谢!
原先如果要用到线程,需要在使用的时候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()则是立马关闭线程池,不论线程任务是否执行完毕。
运行结果:
线程池中提交继承了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()); } } }
运行结果:
线程调度:
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()); } pool.schedule(new Callable<Object>() { },delay,unit); //关闭线程池 shutdown(),shutdownNow() pool.shutdown(); }
对pool.schedule()这个方法的参数介绍,delay是long类型的数字,表明延迟的时间,unit是TimeUnit类型的数据,表明延迟时间的单位。
运行结果:间隔1秒输出