为什么要使用线程池

1.线程池用在什么地方。
1)限制线程的执行数量。
2)节省线程创建和销毁的开销。
3)为异步请求提供执行器。

2.线程池的风险。
1)死锁,不过搜索没有使用共用资源,所以不存在死锁。
2)资源不足,这个需要有足够的经验去调整线程池大小,目前搜索使用的是最小50,最大150,感觉这个有待调整。
3)线程泄漏,如:线程抛出异常便不回收线程。不过使用Jdk自带的线程池是不会有这个问题的。

3.我们的工程是怎样用到线程池的
Future<SearchResultSet> future = poolExe.submit(new SearchTask(sb, offset, limit));
return future.get(TIMEOUT, TimeUnit.MILLISECONDS);
也可以直接使用,即不使用异步,如:
return sb.buildResult(offset, limit);
这样会减少CPU占用,但是降低了对线程的控制,可能会增加内存占用,并且如果服务端出了问题,一定会反应在web端的。

4.mysql是怎么用到线程池的。
mysql使用的是连接池,把持的是网络链接,减少网络链接的创建和销毁。
与线程池并不完全一样,线程池把持的是线程资源,减少线程的创建和销毁。其思想是一样的。

5.Effective Java 里有第68节 Prefer executors and tasks to threads 阐述了为什么要使用executors,它阐述的主要原因是:
1)限制线程启动数量。
2)从架构的角度,要把task跟executor分开,而使用threads是整合在一起的。

猜你喜欢

转载自bandalv.iteye.com/blog/1513753