java线程池原理以及几种线程池类型介绍

上传人:第*** 文档编号:38719838 上传时间:2018-05-06 格式:DOC 页数:15 大小:56KB
返回 下载 相关 举报
java线程池原理以及几种线程池类型介绍_第1页
第1页 / 共15页
java线程池原理以及几种线程池类型介绍_第2页
第2页 / 共15页
java线程池原理以及几种线程池类型介绍_第3页
第3页 / 共15页
java线程池原理以及几种线程池类型介绍_第4页
第4页 / 共15页
java线程池原理以及几种线程池类型介绍_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《java线程池原理以及几种线程池类型介绍》由会员分享,可在线阅读,更多相关《java线程池原理以及几种线程池类型介绍(15页珍藏版)》请在金锄头文库上搜索。

1、JAVA 线程池原理以及几种线程池类型介线程池原理以及几种线程池类型介绍绍文章分类文章分类: :JavaJava 编程编程 线程池线程池在什么情况下使用线程池?在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处使用线程池的好处: : 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。 线程池工作原理:http:/ 该文章里有个例子,简单的描述了线程池的内部实现,建议根据里面的例子来了解 JAVA 线程池的原理。同时,里面还详细描述了使用线程池存在的优点和弊

2、端,大家可以研究下,我觉得是篇非常好的文章。 JDKJDK 自带线程池总类介绍介绍:自带线程池总类介绍介绍: 1、newFixedThreadPool 创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。 2、newCachedThreadPool 创建一个可缓存的线程池。这种类型的线程池特点是: 1).工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。 2).如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默

3、认为 1 分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。 3、newSingleThreadExecutor 创建一个单线程化的 Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行(我觉得这点是它的特色)。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的 。 4、newScheduleThreadPool 创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于 Timer。(这种线程池原理暂还没完全了解透彻) 总结: 一.FixedThre

4、adPool 是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。 二CachedThreadPool 的特点就是在线程池空闲时,即线程池中没有可运行任务时,它会释放工作线程,从而释放工作线程所占用的资源。但是,但当出现新任务时,又要创建一新的工作线程,又要一定的系统开销。并且,在使用 CachedThreadPool 时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。 三就是向各位请教一下,请问各位使用过就是向各位请教一下,请问各位使用过S

5、ingleThreadExecutorSingleThreadExecutor 吗?它一般使用在哪些地方?吗?它一般使用在哪些地方? 刚研究了一下线程池,以上为个人学习过程以及观点,请勿见笑!下章,将分析一下 JDK 自带线程池(ThreadPoolExecutor.java)源码,如果感兴趣,可看看。顺便帮忙踩踩,呵呵! java 线程池原理及简单实例线程池原理及简单实例在现代的操作系统中,有一个很重要的概念线程,几乎所有目前流行的操作系统都支 持线程,线程来源于操作系统中进程的概念,进程有自己的虚拟地址空间以及正文段、数 据段及堆栈,而且各自占有不同的系统资源(例如文件、环境变量等等)。与

6、此不同,线 程不能单独存在,它依附于进程,只能由进程派生。如果一个进程派生出了两个线程,那 这两个线程共享此进程的全局变量和代码段,但每个线程各拥有各自的堆栈,因此它们拥 有各自的局部变量,线程在 UNIX 系统中还被进一步分为用户级线程(由进程自已来管理) 和系统级线程(由操作系统的调度程序来管理)。 既然有了进程,为什么还要提出线程的概念呢?因为与创建一个新的进程相比,创建 一个线程将会耗费小得多的系统资源,对于一些小型的应用,可能感觉不到这点,但对于 那些并发进程数特别多的应用,使用线程会比使用进程获得更好的性能,从而降低操作系 统的负担。另外,线程共享创建它的进程的全局变量,因此线程间

7、的通讯编程会更将简单, 完全可以抛弃传统的进程间通讯的 IPC 编程,而采用共享全局变量来进行线程间通讯。 有了上面这个概念,我们下面就进入正题,来看一下线程池究竟是怎么一回事?其实 线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数 量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中 的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡 眠状态。可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就 创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易 一些,但你却忽略

8、了一个重要的问题性能!就拿我所在的单位来说,我的单位是一个 省级数据大集中的银行网络中心,高峰期每秒的客户端请求并发数超过 100,如果为每个 客户端请求创建一个新线程的话,那耗费的 CPU 时间和内存将是惊人的,如果采用一个拥 有 200 个线程的线程池,那将会节约大量的的系统资源,使得更多的 CPU 时间和内存用来 处理实际的商业应用,而不是频繁的线程创建与销毁。 既然一切都明白了,那我们就开始着手实现一个真正的线程池吧,线程编程可以有多 种语言来实现,例如 C、C、java 等等,但不同的操作系统提供不同的线程 API 接口, 为了让你能更明白线程池的原理而避免陷入烦琐的 API 调用之

9、中,我采用了 JAVA 语言来实 现它,由于 JAVA 语言是一种跨平台的语言,因此你不必为使用不同的操作系统而无法编译 运行本程序而苦恼,只要你安装了 JDK1.2 以上的版本,都能正确地编译运行本程序。另外 JAVA 语言本身就内置了线程对象,而且 JAVA 语言是完全面像对象的,因此能够让你更清 晰地了解线程池的原理,如果你注意看一下本文的标题,你会发现整个示例程序的代码只 有大约 100 行。 本示例程序由三个类构成,第一个是 TestThreadPool 类,它是一个测试程序,用来模 拟客户端的请求,当你运行它时,系统首先会显示线程池的初始化信息,然后提示你从键 盘上输入字符串,并按

10、下回车键,这时你会发现屏幕上显示信息,告诉你某个线程正在处 理你的请求,如果你快速地输入一行行字符串,那么你会发现线程池中不断有线程被唤醒, 来处理你的请求,在本例中,我创建了一个拥有 10 个线程的线程池,如果线程池中没有可 用线程了,系统会提示你相应的警告信息,但如果你稍等片刻,那你会发现屏幕上会陆陆续续提示有线程进入了睡眠状态,这时你又可以发送新的请求了。 第二个类是 ThreadPoolManager 类,顾名思义,它是一个用于管理线程池的类,它的 主要职责是初始化线程池,并为客户端的请求分配不同的线程来进行处理,如果线程池满 了,它会对你发出警告信息。 最后一个类是 SimpleTh

11、read 类,它是 Thread 类的一个子类,它才真正对客户端的请 求进行处理,SimpleThread 在示例程序初始化时都处于睡眠状态,但如果它接受到了 ThreadPoolManager 类发过来的调度信息,则会将自己唤醒,并对请求进行处理。首先我们来看一下 TestThreadPool 类的源码:packagepackage com.thread.simple;importimport java.io.*;publicpublic classclass TestThreadPool /* paramparam args*/publicpublic staticstatic voidv

12、oid main(String args) trytryBufferedReader br = newnew BufferedReader(newnew InputStreamReader(System.in);String s;ThreadPoolManager manager = newnew ThreadPoolManager(10); whilewhile(s = br.readLine() != nullnull)manager.process(s);catchcatch(IOException e)由于此测试程序用到了输入输入类,因此第 1 行导入了 JAVA 的基本 IO 处理包

13、,在第 11 行 中,我们创建了一个名为 manager 的类,它给 ThreadPoolManager 类的构造函数传递了一 个值为 10 的参数,告诉 ThreadPoolManager 类:我要一个有 10 个线程的池,给我创建一个吧!第 12 行至 15 行是一个无限循环,它用来等待用户的键入,并将键入的字符串保存 在 s 变量中,并调用 ThreadPoolManager 类的 process 方法来将这个请求进行处理。 下面我们再进一步跟踪到 ThreadPoolManager 类中去,以下是它的源代码:packagepackage com.thread.simple;import

14、import java.util.*;publicpublic classclass ThreadPoolManager privateprivate intint maxThread;publicpublic Vector vector;publicpublic voidvoid setMaxThread(intint threadCount)thisthis.maxThread = threadCount; publicpublic ThreadPoolManager(intint threadCount)thisthis.setMaxThread(threadCount);System.

15、out.println(“Starting thread pool.“);vector = newnew Vector();forfor(intint i=1;i=10;i+)SimpleThread thread = newnew SimpleThread(i);vector.addElement(thread);thread.start();publicpublic voidvoid process(String argument)intint i;forfor(i = 0;ivector.size();i+)SimpleThread currentThread = (SimpleThre

16、ad)vector.elementAt(i); ifif(!currentThread.isRunning()System.out.println(“Thread “+(i+1)+“ is processing:“+argument);currentThread.setArgument(argument);currentThread.setRunning(truetrue);returnreturn; ifif(i = vector.size()System.out.println(“pool is full,try in another time.“); 我们先关注一下这个类的构造函数,然后再看它的 process()方法。第 1624 行是它的构 造函数,首先它给 ThreadPoolManager 类的成员变量

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号