(3)线程池的由来
在服务器编程模型的原理,每一个客户端连接用一个单独的线程为之服务,当与客户端的会话结束时,线程也就结束了,即每来一个客户端连接,服务器端就要创建一个新线程。
如果访问服务器的客户端很多,那么服务器要不断地创建和销毁线程,这将严重影响服务器的性能。
(4)概念和原理
线程池的概念:首先创建一些线程,它们的集合称为线程池,当服务器接受到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务完后不关闭该线程,而是将该线程还回到线程池中。
在线程池的编程模式下,任务是提交给整个线程池,而不是直接交给某个线程,线程池在拿到任务
后,它就在内部找有无空闲的线程,再把任务交给内部某个空闲的线程,任务是提交给整个线程
池,一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。
(5)相关类和方法
- 从Java5开始提供了线程池的相关类和接口:java.util.concurrent.Executors类和java.util.concurrent.ExecutorService接口。
- 其中Executors是个工具类和线程池的工厂类,可以创建并返回不同类型的线程池,
常用方法如下:
方法声明 功能介绍**static ExecutorService newCachedThreadPool() ****创建一个可根据需要创建新线程的 线程池****static ExecutorService newFixedThreadPool(int nThreads)****创建一个可重用固定线程数的线程池****static ExecutorService newSingleThreadExecutor() ****创建一个只有一个线程的线程池**
其中Executors是个工具类和线程池的工厂类,可以创建并返回不同类型的线程池,
常用方法如下:
方法声明 功能介绍**void execute(Runnable command) ****执行任务和命令,通常用于执行**``**Runnable**** Future submit(Callable **``** task) ****执行任务和命令,通常用于执行**``**Callable****void shutdown() ****启动有序关闭**
线程池类
**public class **``**ThreadPoolTest {**<br />`** **public static void **main**(String[] args) {<br />``<br /> **// 1.**创建一个线程池** **ExecutorService executorService = Executors.**_newFixedThreadPool_**(**10**)**;<br />** **// 2.**向线程池中布置任务** **executorService.submit(**new **ThreadCallableTest())**;<br />** **// 3.**关闭线程池** **executorService.shutdown()**;<br />** `**}****}**
线程类
**package **``**com.lagou.task18**``**;<br />**``**import **``**java.util.concurrent.Callable**``**;<br />**``**import **``**java.util.concurrent.ExecutionException**``**;<br />**``**import **``**java.util.concurrent.FutureTask**``**;<br />**``**public class **``**ThreadCallableTest **``**implements **``**Callable {**<br />`** **@Override** **public **Object **call**() **throws **Exception {**`<br />`** **// **计算**1 ~ 10000**之间的累加和并打印返回<br />** **int **sum = **0**;** for **(**int **i = **1**; **i <= **10000**; **i++) {<br /> sum +=i**;<br />** **}**`<br />`** System.**out**.println(**“**计算的累加和是:**“ **+ sum)**; **// 50005000<br />** **return **sum**;<br />** **}**`<br />** **``**public static void **``**main**``**(String[] args) {**<br />`** ThreadCallableTest tct = **new **ThreadCallableTest()**;** **FutureTask ft = **new **FutureTask(tct)**;<br />** **Thread t1 = **new **Thread(ft)**;** **t1.start()**;<br />** **Object obj = **null;** try **{<br /> obj = ft.get()**;<br />** **} **catch **(InterruptedException e) {**`<br />`** e.printStackTrace()**;** **} **catch **(ExecutionException e) {<br /> e.printStackTrace()**;<br />** **}**`<br />`** System.**out**.println(**“**线程处理方法的返回值是:**“ **+ obj)**; **// 50005000<br />** `**}****}**
