Java并发编程:线程池
什么是线程池,当一个线执行完一个任务后就死亡了,如果程序并发的线程数量非常多,频繁的创建销毁线程会降低执行的效率。
这样,可以创建一些线程,它们的集合称为线程池,当服务器接受到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务完后不关闭该线程,而是将该线程还回到线程池中。
在线程池的编程模式下,任务是提交给整个线程池,而不是直接交给某个线程,线程池在拿到任务后,它就在内部找有无空闲的线程,再把任务交给内部某个空闲的线程,这就是封装。任务是提交给整个线程池,一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。
ThreadPoolExecutor类:
Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),返回值为void,参数为Runnable类型,从字面意思可以理解,就是用来执行传进去的任务的;然后ExecutorService接口继承了Executor接口,并声明了一些方法:submit、invokeAll、invokeAny以及shutDown等;
抽象类AbstractExecutorService实现了ExecutorService接口,基本实现了ExecutorService中声明的所有方法;
然后ThreadPoolExecutor继承了类AbstractExecutorService。
在ThreadPoolExecutor类中有几个非常重要的方法:
execute()
submit()
shutdown()
shutdownNow()
例子:创建一个线程池,用于执行10个任务。
import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class ThreadPoolTest { /** * @param args */ public static void main(String[] args) { // ExecutorService threadPool = Executors.newFixedThreadPool(3); ExecutorService threadPool = Executors.newCachedThreadPool(); // ExecutorService threadPool = Executors.newSingleThreadExecutor(); for(int i=1; i<=10; i++){ final int task = i; threadPool.execute(new Runnable(){ //execute 执行一次任务 public void run(){ for(int j=1; j<=10; j++){ // 每个任务输出10次循环 try{ Thread.sleep(20); } catch(InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is looping of " + j + " for task of " + task + " " + new Date()); } } }); } /* 上面的代码是在提交任务,并且所有的任务都已经提交了,但任务是什么时候执行的,则是由线程池调度的! */ System.out.println("All of 10 tasks have commited!"); threadPool.shutdown(); //shutdown() 方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务。 //shutdown() 拒绝传入任务,执行以提交线程池的任务 shutdownNow() 取消所有遗留任务 //线程池启用定时器线程5s后开始爆炸,每隔2s炸一次 Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable(){ //atFixedRate 在固定的频率 public void run(){ System.out.println("Bombing..." + new Date()); } }, 5, 2, TimeUnit.SECONDS); /* 瑕疵 无指定时间点方法 可以使用 要定时的时间-现在的时间 schedule(task,date.getTime()-System.currentTimeMillis(),TimeUnit.MILLISECOUNDS); */ } }
/* 用线程池实现:子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次。 */ public class ThreadCommunication { public static void main(String[] args) { final Business bussiness = new Business(); new Thread(new Runnable(){ public void run() { for(int i=1; i<=50; i++){ bussiness.sub(i); } } }).start(); for(int i=1; i<=50; i++){ bussiness.main(i); } } } class Business{ private boolean bShouldSub = true; public synchronized void sub(int i) { while(!bShouldSub){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1; j<=10; j++) { System.out.println("sub thread sequence of " + j + ", loop of " + i ); } bShouldSub = false; this.notify(); } public synchronized void main(int i) { while(bShouldSub){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1; j<=100; j++) { System.out.println("main thread sequence of " + j + ", loop of " + i ); } bShouldSub = true; this.notify(); } }
相关推荐
Java并发编程:线程池的使用 - 平凡希 - 博客园平凡希博客园首页联系管理随笔 - 127 文章 - 1 评论 - 94Java并发编程:线程池的使用在前面
而了解 Java 并发编程以及其中的 JUC(java.util.concurrent)线程池,对于构建高性能、高可伸缩性的应用程序具有重要意义。 多核处理器的出现使得并发执行成为一种重要的优化手段。了解并发编程和线程池的工作原理...
23 高并发编程和线程池,教程视频:java中高并发编程和线程池
阿里专家级并发编程架构师级课程,完成课程的学习可以帮助同学们解决非常多的JAVA并发编程疑难杂症,极大的提高JAVA并发编程的效率。课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类...
《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...
Java 并发编程在现代软件开发中占据重要地位,尤其是在多核处理器的时代。JUC(java.util.concurrent)库是 Java 标准库的一部分,提供了丰富的多线程并发工具,旨在帮助开发者编写高性能、高可伸缩性的并发程序。...
《Java并发编程从入门到精通》内容包括并发编程概念,线程,线程安全,线程集合类,线程阀,线程池,Fork/Join,线程、线程池在互联网项目开发的应用,线程监控及线程分析,Android中线程应用。 本书适合Java开发...
java并发编程相关总结
1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 ...
Java并发编程的艺术 作者:方腾飞 魏鹏 程晓明 著 丛书名:Java核心技术系列 出版日期 :2015-07-25 ISBN:978-7-111-50824-3 第1章介绍Java并发编程的挑战,向读者说明进入并发编程的世界可能会遇到哪些问题,以及如何...
, 《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,...
下面小编就为大家带来一篇java并发编程_线程池的使用方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在思维导图中,我们可以包括Java并发编程的基本概念、线程管理、锁、并发集合、线程池、并发控制等方面的内容。同时,我们还可以将相关的类和接口进行关联和整合,形成完整的知识网络。 总之,Java并发编程是一个...
Java并发编程与高并发解决方案:线程池,消息队列,服务拆分,限流,降级,熔断思路,数据库分表
Java并发编程技术总结,所含内容有并发特性、并发锁、线程池、并发场景解决方案等,对于性能思考和内容参考资料有一定说明
JDK提供的这些容器⼤部分在java.util.concurrent包中。我们挑选出⼀些⽐较有代表性的并发容器 1 类,来感受⼀下JDK⾃带的并发集合带来的“快感”。 ConcurrentLinkedQueue是⼀个基于链接节点的⽆界线程安全队列,它...
Java 并发学习笔记: 进程和线程, 并发理论, 并发关键字, Lock 体系, 原子操作类, 发容器 & 并发工具, 线程池, 并发实践 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的...
java并发编程的联系代码,由低到高,包含线程安全、锁、线程通讯、线程池、Concurrent包内容的使用、各种阻塞队列的联系等知识。