====== 线程池 ======
===== 线程池的原理及实现 =====
http://blog.csdn.net/hsuxu/article/details/8985931
===== 线程池的好处 =====
由于创建和关闭线程比较耗资源耗时,所以使用线程池,在应用启动时候,就创建多个线程,减少用户请求时创建和关闭线程的时间;而且使用完毕,线程不关闭,可以重复使用,提高并发性能
===== spring实现线程池 =====
==== application-pool.xml ====
==== ThreadController.java ====
package com.gxx.record.web.thread;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.gxx.record.thread.TestThread;
/**
* RedisController
*
* @author gxx
*/
@Controller
@RequestMapping("/thread/")
public class ThreadController {
/**
* 日志处理器
*/
private final Logger logger = Logger.getLogger(ThreadController.class);
@Autowired
private TaskExecutor taskExecutor;
/**
* 执行线程
* @param request
* @return
*/
@RequestMapping(value = "/execute",produces="application/json")
public @ResponseBody String execute() {
logger.info("执行线程,开始===");
for(int i=0;i<20;i++){
taskExecutor.execute(new TestThread());
}
logger.info("执行线程,结束===");
return "执行线程OK~";
}
}
==== TestThread.java ====
package com.gxx.record.thread;
import org.apache.log4j.Logger;
/**
*
* - Title:
* -
* none
*
* - Description:测试线程
* -
*
none
*
*
*
* @author Administrator
* @version 1.0, 2016年1月12日
* @since record
*
*/
public class TestThread implements Runnable {
/**
* 日志处理器
*/
private final Logger logger = Logger.getLogger(TestThread.class);
@Override
public void run() {
double random = Math.random();
logger.info("线程[" + random + "]开始====");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
logger.error("异常发生", e);
}
logger.info("线程[" + random + "]结束====");
}
}
===== 请求地址 =====
[Protocol]://[IP]:[Port]/record/thread/execute.htm
===== 并发日志 =====
2016-01-12 17:32:47,500 [http-80-exec-3] INFO [com.gxx.record.web.thread.ThreadController:35] - 执行线程,开始===
2016-01-12 17:32:47,536 [taskExecutor-1] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.7581638006104884]开始====
2016-01-12 17:32:47,542 [taskExecutor-2] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.26717497775717225]开始====
2016-01-12 17:32:47,544 [http-80-exec-3] INFO [com.gxx.record.web.thread.ThreadController:39] - 执行线程,结束===
2016-01-12 17:32:47,551 [taskExecutor-3] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.2286343802659081]开始====
2016-01-12 17:32:47,551 [taskExecutor-4] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.40159528085293983]开始====
2016-01-12 17:32:47,551 [taskExecutor-5] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.7048063013994695]开始====
2016-01-12 17:32:52,537 [taskExecutor-1] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.7581638006104884]结束====
2016-01-12 17:32:52,537 [taskExecutor-1] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.059500105635519995]开始====
2016-01-12 17:32:52,543 [taskExecutor-2] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.26717497775717225]结束====
2016-01-12 17:32:52,543 [taskExecutor-2] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.11292183552137725]开始====
2016-01-12 17:32:52,552 [taskExecutor-5] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.7048063013994695]结束====
2016-01-12 17:32:52,552 [taskExecutor-3] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.2286343802659081]结束====
2016-01-12 17:32:52,552 [taskExecutor-4] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.40159528085293983]结束====
2016-01-12 17:32:52,552 [taskExecutor-4] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.7358251609451018]开始====
2016-01-12 17:32:52,552 [taskExecutor-5] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.1580951886133759]开始====
2016-01-12 17:32:52,552 [taskExecutor-3] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.52309011015079]开始====
2016-01-12 17:32:57,537 [taskExecutor-1] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.059500105635519995]结束====
2016-01-12 17:32:57,537 [taskExecutor-1] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.7715091558058593]开始====
2016-01-12 17:32:57,543 [taskExecutor-2] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.11292183552137725]结束====
2016-01-12 17:32:57,543 [taskExecutor-2] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.4012926228584127]开始====
2016-01-12 17:32:57,552 [taskExecutor-5] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.1580951886133759]结束====
2016-01-12 17:32:57,552 [taskExecutor-4] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.7358251609451018]结束====
2016-01-12 17:32:57,552 [taskExecutor-5] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.01744115803065438]开始====
2016-01-12 17:32:57,552 [taskExecutor-4] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.24932939144870025]开始====
2016-01-12 17:32:57,553 [taskExecutor-3] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.52309011015079]结束====
2016-01-12 17:32:57,553 [taskExecutor-3] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.04881832451589985]开始====
2016-01-12 17:33:02,538 [taskExecutor-1] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.7715091558058593]结束====
2016-01-12 17:33:02,539 [taskExecutor-1] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.4083415424974973]开始====
2016-01-12 17:33:02,544 [taskExecutor-2] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.4012926228584127]结束====
2016-01-12 17:33:02,544 [taskExecutor-2] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.2364869187222809]开始====
2016-01-12 17:33:02,553 [taskExecutor-5] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.01744115803065438]结束====
2016-01-12 17:33:02,553 [taskExecutor-4] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.24932939144870025]结束====
2016-01-12 17:33:02,553 [taskExecutor-5] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.4265823186451243]开始====
2016-01-12 17:33:02,553 [taskExecutor-4] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.1992069353563678]开始====
2016-01-12 17:33:02,554 [taskExecutor-3] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.04881832451589985]结束====
2016-01-12 17:33:02,554 [taskExecutor-3] INFO [com.gxx.record.thread.TestThread:31] - 线程[0.5413294134596947]开始====
2016-01-12 17:33:07,539 [taskExecutor-1] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.4083415424974973]结束====
2016-01-12 17:33:07,544 [taskExecutor-2] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.2364869187222809]结束====
2016-01-12 17:33:07,553 [taskExecutor-5] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.4265823186451243]结束====
2016-01-12 17:33:07,553 [taskExecutor-4] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.1992069353563678]结束====
2016-01-12 17:33:07,554 [taskExecutor-3] INFO [com.gxx.record.thread.TestThread:37] - 线程[0.5413294134596947]结束====
===== 前端输出 =====
无需等待线程执行完,立刻返回:执行线程OK~