Board logo

标题: web项目中线程池的正确使用方式(1) [打印本页]

作者: look_w    时间: 2019-5-13 10:21     标题: web项目中线程池的正确使用方式(1)

线程数一直增加的问题



普通简单多线程的使用方式是


       Thread t=new Thread();           
        t.start();//启动线程对象t  



但是在web项目中发现查看控制台这种情况会导致线程数一直增加:

thread-1
thread-2
thread-3
.......

thread-50
thread-51
thread-52


这种情况下说明线程没有被关闭回收。

当线程数太多时,肯定会导致内存溢出或者影响服务器性能等。



所以我们在使用多线程时,应该尽量多使用线程池。

线程池在正确使用的情况下会替我们管理线程的回收关闭,以及处理线程的等待等等。


一般的线程池在main中使用的方式:

// 多线程线程池
                       Thread  myThread=new Thread();
ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.submit(myThread);
executorService.shutdown();


shutdown是关闭线程池,不再接受新任务,等线程池中已经submit的线程运行完之后线程池就处于关闭状态了。


很多情况下线程池是必须调用shutdown的,否则当使用的是CachedThreadPool类型的线程池时线程数还是会一直增加直到溢出。



线程池序号一直增加的问题


我们这里使用了FixedThreadPool类型的线程池。

在每次action中使用

// 多线程线程池
                       Thread myThread=new Thread();
ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.submit(myThread);
executorService.shutdown();




发现虽然线程数没在增加了 但是线程池的数量一直在增加。

线程池序号一直增加

pool-1-thread-1
pool-2-thread-1
pool-3-thread-1
pool-4-thread-1



这种情况说明线程池在web项目中没有得到正常关闭。



因为我们的web项目spring框架中,局部变量的生命周期是受spring框架来掌控的。


所以每次都new一个线程池的使用方式会导致 线程池序号一直增加。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0