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