`
Lucas_
  • 浏览: 4805 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java并发编程:线程池

 
阅读更多

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并发编程:线程池的使用 - 平凡希 - 博客园1

    Java并发编程:线程池的使用 - 平凡希 - 博客园平凡希博客园首页联系管理随笔 - 127 文章 - 1 评论 - 94Java并发编程:线程池的使用在前面

    java并发编程:juc线程池

    而了解 Java 并发编程以及其中的 JUC(java.util.concurrent)线程池,对于构建高性能、高可伸缩性的应用程序具有重要意义。 多核处理器的出现使得并发执行成为一种重要的优化手段。了解并发编程和线程池的工作原理...

    23 高并发编程和线程池

    23 高并发编程和线程池,教程视频:java中高并发编程和线程池

    阿里专家级并发编程架构师课程 彻底解决JAVA并发编程疑难杂症 JAVA并发编程高级教程

    阿里专家级并发编程架构师级课程,完成课程的学习可以帮助同学们解决非常多的JAVA并发编程疑难杂症,极大的提高JAVA并发编程的效率。课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类...

    《Java并发编程的艺术》

    《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...

    java编发编程:JUC综合讲解

    Java 并发编程在现代软件开发中占据重要地位,尤其是在多核处理器的时代。JUC(java.util.concurrent)库是 Java 标准库的一部分,提供了丰富的多线程并发工具,旨在帮助开发者编写高性能、高可伸缩性的并发程序。...

    java并发编程从入门到精通

    《Java并发编程从入门到精通》内容包括并发编程概念,线程,线程安全,线程集合类,线程阀,线程池,Fork/Join,线程、线程池在互联网项目开发的应用,线程监控及线程分析,Android中线程应用。 本书适合Java开发...

    java并发编程 线程池 异步编排

    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并发编程的艺术 作者:方腾飞 魏鹏 程晓明 著 丛书名:Java核心技术系列 出版日期 :2015-07-25 ISBN:978-7-111-50824-3 第1章介绍Java并发编程的挑战,向读者说明进入并发编程的世界可能会遇到哪些问题,以及如何...

    Java并发编程的艺术

    , 《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,...

    java并发编程_线程池的使用方法(详解)

    下面小编就为大家带来一篇java并发编程_线程池的使用方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    并发思维导图Java并发编程的相关概念和知识

    在思维导图中,我们可以包括Java并发编程的基本概念、线程管理、锁、并发集合、线程池、并发控制等方面的内容。同时,我们还可以将相关的类和接口进行关联和整合,形成完整的知识网络。 总之,Java并发编程是一个...

    Java并发编程与高并发解决方案

    Java并发编程与高并发解决方案:线程池,消息队列,服务拆分,限流,降级,熔断思路,数据库分表

    Java并发编程技术总结

    Java并发编程技术总结,所含内容有并发特性、并发锁、线程池、并发场景解决方案等,对于性能思考和内容参考资料有一定说明

    并发容器和线程池,java并发编程3

    JDK提供的这些容器⼤部分在java.util.concurrent包中。我们挑选出⼀些⽐较有代表性的并发容器 1 类,来感受⼀下JDK⾃带的并发集合带来的“快感”。 ConcurrentLinkedQueue是⼀个基于链接节点的⽆界线程安全队列,它...

    Java 并发学习笔记:进程和线程,并发理论,并发关键字,Lock 体系,原子操作类,发容器 &amp; 并发工具,线程池,并发实践

    Java 并发学习笔记: 进程和线程, 并发理论, 并发关键字, Lock 体系, 原子操作类, 发容器 & 并发工具, 线程池, 并发实践 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的...

    Java并发编程进阶练习代码

    java并发编程的联系代码,由低到高,包含线程安全、锁、线程通讯、线程池、Concurrent包内容的使用、各种阻塞队列的联系等知识。

Global site tag (gtag.js) - Google Analytics