美文网首页
多线程知识点总结(3)

多线程知识点总结(3)

作者: 天渊hyominnLover | 来源:发表于2018-08-15 10:35 被阅读2次

线程池

基本线程池应用

JDK自带线程池Executor接口,子接口是ExecutorService,最常用的实现是ThreadPoolExecutor:

private static void testExecutor(){
        //实例化一个ThreadPoolExecutor线程池,包含5条线程
        //corePoolSize和maximumPoolSize均为5,keepAliveTime为0,默认workQueue为LinkedBlockingQueue
        ExecutorService service = Executors.newFixedThreadPool(5);
        
        //放入两个任务
        service.submit(()->{
           for(int i = 0; i<10; i++){
               try {
                   System.out.println("第一个任务:"+":"+i);
                   Thread.sleep(500);
               }catch (Exception e){
                   e.printStackTrace();
               }
           }
        });
        service.submit(()->{
            for(int i = 0; i<10; i++){
                try {
                    System.out.println("第二个任务:"+":"+i);
                    Thread.sleep(500);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
        
        //主线程来判断线程池中所有任务是否已经完成
        while (!service.isTerminated()){
            System.out.println("主线程等待中......");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

在这个例子中,corePoolSize、maximumPoolSize和keepAliveTime都没刻意设置:

  • corePoolSize:线程池中常驻的线程数量,不会被销毁
  • maximumPoolSize:最大线程数量,如果加入的任务数量超过了常驻线程数量,则新建额外的线程来满足需求,直到达到最大数量后进入阻塞状态
  • keepAliveTime:创建的额外线程进入闲置状态后的允许等待时间,超过这个时间则销毁
  • 默认的阻塞容器为LinkedBlockingQueue

返回异步任务结果

若需要获得异步任务的执行结果,则需要启用Future和Callable接口:

private static void testFuture(){
        //继续创建5个线程的线程池
        ExecutorService service = Executors.newFixedThreadPool(5);

        //通过Callable和Future来获取异步任务执行结果
        Future<String> future1 = service.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                for(int i = 0; i<10; i++){
                    System.out.println("第一个任务");
                }
                return "第一个任务执行完成!";
            }
        });
        try {
            //异步任务执行完后再由Future返回执行结果
            //Future的get方法是一个持续等待的阻塞方法
            System.out.println(future1.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

相关文章

  • 多线程知识点总结(3)

    线程池 基本线程池应用 JDK自带线程池Executor接口,子接口是ExecutorService,最常用的实现...

  • iOS多线程实现方案之 -- NSThread

    书接上回, 上次谈到iOS 多线程知识点总结之: 进程和线程, 接着就是 多线程实现方案里面的 NSThread...

  • iOS知识体系总结-多线程

    注意:更新内容会同步到GitHub iOSWiki-知识体系总结 总结-多线程 iOS知识点/操作系统 #iOS...

  • BAT研发面试36题总结:Spring+Redis+Docker

    面试总结: java的基础知识点,主要围绕在集合类和多线程等:ArrayList、LinkedList、HashS...

  • Java多线程 ----(1)多线程基础

    1、什么是多线程和使用多线程的意义2、多线程基础知识点框架图3、实现多线程的三种方式4、三种方式对比 1、什么是多...

  • 学习计划

    序号知识点进度1WinForm事件机制2C#多线程3Vue前端

  • 线程GCD

    本文只是学习他人知识点进行一定的总结巩固自己的理解学习GCD看我就够了iOS多线程全套 一、多线程的定义 计算机在...

  • 多线程知识小结

    前言 最近有看到马士兵老师在B站上一个关于多线程的视频,在此把重要的知识点进行总结。 正文 多线程基础 1.syn...

  • 目录

    1. 为什么要引入多线程? 2. 何时应该使用多线程? 3. 举例说明常见的有多线程问题的代码。 4. 总结多线程...

  • 多线程知识点总结

    一、进程和线程的区别:进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包...

网友评论

      本文标题:多线程知识点总结(3)

      本文链接:https://www.haomeiwen.com/subject/qjmibftx.html