zoukankan      html  css  js  c++  java
  • 线程池的处理流程:

    线程池的处理流程:

    线程池执行示意图:

    1,首先线程池判断基本线程池是否已满(< corePoolSize ?)?没满,创建一个工作线程来执行任务。满了,则进入下个流程。

    2,其次线程池判断工作队列是否已满?没满,则将新提交的任务存储在工作队列里。满了,则进入下个流程。

    3,最后线程池判断整个线程池是否已满(< maximumPoolSize ?)?没满,则创建一个新的工作线程来执行任务,满了,则交给饱和策略来处理这个任务。

    总结:线程池优先要创建出基本线程池大小(corePoolSize)的线程数量,没有达到这个数量时,每次提交新任务都会直接创建一个新线程,当达到了基本线程数量后,又有新任务到达,优先放入等待队列,如果队列满了,才去创建新的线程(不能超过线程池的最大数maxmumPoolSize)


    向线程池提交任务的两种方式:

    1)通过execute()方法

    [java] view plain copy
     
    1. ExecutorService threadpool= Executors.newFixedThreadPool(10);    
    2. threadpool.execute(new Runnable(){...});  

    这种方式提交没有返回值,也就不能判断任务是否被线程池执行成功。

    2)通过submit()方法

    [java] view plain copy
     
    1. Future<?> future = threadpool.submit(new Runnable(){...});    
    2.     try {    
    3.             Object res = future.get();//获取任务执行结果    
    4.         } catch (InterruptedException e) {    
    5.             // 处理中断异常    
    6.             e.printStackTrace();    
    7.         } catch (ExecutionException e) {    
    8.             // 处理无法执行任务异常    
    9.             e.printStackTrace();    
    10.         }finally{    
    11.             // 关闭线程池    
    12.             executor.shutdown();    
    13.         }    

    使用submit 方法来提交任务,它会返回一个Future对象,通过future的get方法来获取返回值,get方法会阻塞住直到任务完成,而使用get(long timeout, TimeUnit unit)方法则会阻塞一段时间后立即返回,这时有可能任务没有执行完。

  • 相关阅读:
    [置顶] 算法设计基础
    .net 多线程学习
    如何获得Repeater中的列
    npoi导出excel
    字符串的格式化问题
    用线程修改页面中的值(一)
    正则表达式的验证数值验证
    .net 线程更新页面中的值(方法二)
    .net 线程更新页面中的值(方法一)
    字符串的分割
  • 原文地址:https://www.cnblogs.com/panxuejun/p/8630245.html
Copyright © 2011-2022 走看看