Java线程池总结

来源:互联网 发布:mac电脑excel换行 编辑:程序博客网 时间:2024/05/17 22:52

Java线程池总结

 

Java多线程知识中,线程池算是一个比较高级的知识了。但是很多面试或应用中都会有涉及到。

本文将对java线程池的知识做一下简单介绍,并用实际例子做阐述。

 




.线程池的作用:


  线程池可以很好地提高性能,尤其是当程序中需要创建大量生存周期很短的线程时,更应该考虑使用线程池。

使用线程池可以有效地控制系统中并发线程的数量,当系统中包含大量并发线程时,会导致系统性能剧烈下降,

甚至导致JVM崩溃,而线程池的最大线程数参数可以控制系统中并发线程数不超过此数。

 

 

 

二.线程池的创建

 

(一)静态方法

JAVA5开始新增了一个Executors工具类来产生线程池,它有如下几个静态工厂方法来创建线程池。

 

强烈建议使用较为方便的 Executors 工厂方法

1.Executors.newCachedThreadPool()  创建一个具有缓冲功能的线程池(线程池为无限大),

但是在以前构造的线程可用时将重用它们。


2.Executors.newFixedThreadPool(int) 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程


3.Executors.newSingleThreadExecutor() 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程


4.Executors.newScheduledThreadPool(int corePoolSize) 创建一个线程池,

它可安排在给定延迟后运行命令或者定期地执行


5.Executors.newSingleThreadScheduledExecutor(int corePoolSize) 创建一个只有一条线程的线程池池,

它可安排在给定延迟后运行命令或者定期地执行

 

 

上面方法中前三个方法返回的是:ExecutorService对象,

后面两个返回的是ScheduledExecutorService对象是ExecutorService的子类。


 

ExecutorService代表尽快执行线程的线程池(只要线程池中有空闲的线程,就立即执行线程任务),

程序只要将一个Runnable对象或Callable对象(代表线程任务)提交给该线程,该线程就会尽快执行该任务

 

ExecutorService方法:

shutdown() 启动一次顺序关闭线程池,执行以前提交的任务,但不接受新任务。

shutdownNow() 试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表

 

 

 




(二)使用线程池来执行线程任务的步骤


1.调用Executor类的静态方法来创建一个ExecutorService对象,该对象代表一个线程池。

2.调用Runnable实现类的示例,作为线程执行任务。

3.调用ExecutorService对象的submit方法来提交Runnable示例。

4.当不想提交任务时,调用ExecutorService对象的shutdown方法来关闭线程。

 





(三)线程池的一个简单例子

 





运行结果




 

这和我们普通线程的使用其实差不多,但是相关类和方法有很大的区别。

其中记住上面的四个步骤是很重要的。



 

四.下面说一下线程池的相关概述:

 

(一)什么原因使我们不得不使用线程池? 

主要原因是:短时间内需要处理的任务数量很多 



(二)使用线程池的好处

1.减少在创建和销毁线程上所花的时间以及系统资源的开销 
2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存 



(三)FixedThreadPool是一个典型且优秀的线程池,

它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。

但在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。 



(四)CachedThreadPool的特点就是在线程池空闲时,即线程池中没有可运行任务时,

它会释放工作线程,从而释放工作线程所占用的资源。但是,但当出现新任务时,

又要创建一新的工作线程,又要一定的系统开销。并且,在使用CachedThreadPool时,

一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。 




五.线程池的一个实际应用例题


题目要求:1 创建线程数量为5的线程池。 2 同时运行5个卖票窗口。 3 总票数为100,每隔一秒钟卖一张票


参考答案如下:





本文对java线程池作了简要的描述和使用。其中线程池还有很多相关类和方法没有说到,

想了解的可以自己多去研究。

4 0
原创粉丝点击