博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程池的处理流程:
阅读量:6228 次
发布时间:2019-06-21

本文共 961 字,大约阅读时间需要 3 分钟。

线程池的处理流程:

线程池执行示意图:

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

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

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

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

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

1)通过execute()方法

 

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

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

 

2)通过submit()方法

[java] 
 
 
  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)方法则会阻塞一段时间后立即返回,这时有可能任务没有执行完。

你可能感兴趣的文章
我们一起学习WCF 第五篇数据协定和消息协定
查看>>
Linux 与 Windows 文件互传(VMWare)
查看>>
Python学习笔记八 面向对象高级编程(一)
查看>>
Oracle内置函数
查看>>
UVA 1645 Count
查看>>
贪吃蛇程序
查看>>
poj 1419 Graph Coloring
查看>>
node的安装及其运用及相关配置
查看>>
第19篇 2016年计划
查看>>
左连接,右连接,内连接
查看>>
Django+element ui前后端不分离的博客程序
查看>>
托福听力
查看>>
2018-2019-1 20165302 《信息安全系统设计基础》第四周学习总结
查看>>
类似百度图片排版效果
查看>>
【学习笔记】DataTable根据多列分组
查看>>
PE文件格式介绍
查看>>
使用VS GDB扩充套件在VS上远端侦错Linux上的C/C++程序
查看>>
求助关于asp.net里使用ocx控件的问题
查看>>
asp.net生成条形码
查看>>
线段树基本格式
查看>>