|
|
51CTO旗下网站
|
|
移动端

1.4.4 基本用法与思考

《Java多线程与Socket:实战微服务框架》第1章多线程基础,本书尽量采用简要和通俗易懂的方式来介绍多线程知识。本节为大家介绍基本用法与思考。

作者:庞永华来源:电子工业出版社|2019-03-26 15:49

【大咖·来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》

1.4.4 基本用法与思考

下面的示例演示了线程池的创建、使用和关闭:

  1. public class C1_4_4 {  
  2. public static void main(String[] args) throws InterruptedException {  
  3. // 可以尝试不同类型的线程池,并相应地调整线程数  
  4. ExecutorService es = Executors.newCachedThreadPool();  
  5. long l = System.currentTimeMillis();  
  6. for (int i = 0; i < 5; i++) {  
  7. es.execute(new Runnable() {  
  8. @Override  
  9. public void run() {  
  10. int i = 0;  
  11. // 无论用shutdown()还是用shutdownNow()去关闭线程池,  
  12. // 此线程最终都会停止  
  13. while (!Thread.interrupted() && i < Integer.MAX_VALUE) {  
  14. i++;  
  15. }  
  16. }  
  17. });  
  18. }  
  19. es.shutdown();  
  20. // es.shutdownNow();  
  21. // 此处最多会阻塞10秒,以等待线程池中的任务完成,但池中的线程未必会随之而终止!  
  22. es.awaitTermination(10L, TimeUnit.SECONDS);  
  23. System.out.println(System.currentTimeMillis() - l);  
  24. }  

现在让我们尝试将run()方法中的代码分别替换为如下两种形式,再分别用shutdown()和shutdownNow()两种方式来关闭连接池,观察程序的执行及退出情况:

  1. // 形式1:  
  2. // 用shutdown()关闭线程池时,此线程无法被中断  
  3. // 因为shutdown()不会调用线程的interrupt()方法  
  4. while (!Thread.interrupted()) {  
  5. // do something  
  6. }  
  7. // 形式2:  
  8. // 此循环用shutdownNow()也无法中断,线程将无法终止(除非自身主动退出或异常中断)  
  9. while (true) {  
  10. // do something  


喜欢的朋友可以加入官方的读书群

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

Jenkins Pipeline可持续化集成

Jenkins Pipeline可持续化集成

优化运维流水线
共3章 | youerning

198人订阅学习

笑熬浆糊之职场那些事

笑熬浆糊之职场那些事

IT人的职场心法
共22章 | Bear_Boss

79人订阅学习

Redis运维秘籍

Redis运维秘籍

运维标配技术
共15章 | one叶孤舟

199人订阅学习

读 书 +更多

网管员必读——网络组建(第2版)

《网管员必读——网络组建(第2版)》仍是以一个中等规模的模拟局域网组建为思路,较全面地介绍了与局域网组建相关的各方面知识和组建、配...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客