(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 />** `**}**
**}**