手记

【九月打卡】第9天 多线程的安全与应用(下)

课程名称:Java体系课

章节名称:多线程的安全与应用(下)

课程内容:

  • 初识线程池及其应用
  • JUC
  • JUC支持的线程池种类
  • 启动线程池的方法

学习收获:

  • JUC:java.util.concurrent
    并发是伴随着多核处理器的诞生而产生的,为了充分利用硬件资源,诞生了多线程技术。但是多线程又存在资源竞争的问题,引发了同步和互斥的问题,JDK1.5推出的java.lang.concurrent(并发工具包)来解决这些问题
  • Runnable接口的弊端
    Runnable新建线程,性能差
    线程缺乏统一管理,可能无限制的新建线程,相互竞争,严重时会占有过多系统资源导致死机或内存溢出
  • 线程池
    1.线程复用(跑道)
    2.重用存在的线程,减少线程对象创建、消亡的开销
    3.线程总数可控,提高资源的利用率
    4.提高额外功能,定时执行、定期执行、监控等
  • 四种线程池
    在java.util.concurrent中,提供了工具类Executors(调度器)对象来创建线程池,可创建的线程池有四种
  1. FixedThreadPool——定长线程池
    定长线程池的特点是固定线程总数,空闲线程用于执行任务,如果线程都在使用,后续任务则处于等待状态
//创建一个可创建一个定长线程池
        //定长线程池的特点是固定线程总数,空闲线程用于执行任务,如果线程都在使用,后续任务则处于等待状态
        ExecutorService threadPool = Executors.newFixedThreadPool(10);
        for(int i = 1; i <= 1000 ; i++){
            final int index = i;
            //不需要返回值,使用execute方法执行Runnable对象
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+":" + index );
                }
            });
            /*
            需要返回值,使用submit方法执行Callable对象,利用Future对象接收返回值
            Future<Object> ret = threadPool.submit(new Callable<Object>() {
                @Override
                public Object call() throws Exception {
                    return null;
                }
            });
            */
        }
        //处理完毕关闭线程池
        threadPool.shutdown();
  1. CachedThreadPool——可缓存线程池
    根据运行情况动态调整缓存大小,可缓存线程池无限大,如果线程池中没有可用的线程则创建,有空闲线程则利用起来
//调度器对象
        //ExecutorService用于管理线程池
        ExecutorService threadPool = Executors.newCachedThreadPool();//创建一个可缓存线程池
        //可缓存线程池的特点是,无限大,如果线程池中没有可用的线程则创建,有空闲线程则利用起来
        for(int i = 1 ; i <= 1000 ; i++) {
            final  int index = i;
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + ":" + index);
                }
            });
        }
        threadPool.shutdown();
  1. SingleThreadPool——单线程池
    全局有且只有唯一一个线程,应用较少。
//调度器对象
        //ExecutorService用于管理线程池
        ExecutorService threadPool = Executors.newSingleThreadExecutor();//单线程线程池
        for(int i = 1 ; i <= 1000 ; i++) {
            final  int index = i;
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + ":" + index);
                }
            });
        }
        threadPool.shutdown();
  1. ScheduledThreadPool——调度线程池
    根据实际情况决定每个任务间隔多长时间运行一次
//调度线程池
        ScheduledExecutorService scheduledThreadPool =  Executors.newScheduledThreadPool(5);//可调度线程池
        //延迟1秒执行,每三秒执行一次
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(new Date() + "延迟1秒执行,每三秒执行一次");
            }
        }, 1, 3, TimeUnit.SECONDS);
    }
  • 启动线程池的方法
    1.invokeAll方法(Interface ExecutorService)
    2.execute方法(Interface Executor)
    3.submit方法(Interface ExecutorService)

课程截图

0人推荐
随时随地看视频
慕课网APP

相关阅读

5.4 线程池