在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java/ web項(xiàng)目線程數(shù)不斷增多

web項(xiàng)目線程數(shù)不斷增多

線程池配置:

<bean id = "threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="1"/>
    <property name="maxPoolSize" value="20"/>
    <property name="queueCapacity" value="500"/>
</bean>

每次對(duì)controller發(fā)一個(gè)請(qǐng)求,則多一個(gè)線程,且線程始終不被回收。而且,多出的線程是以這樣的規(guī)律出現(xiàn)的:

pool-3-thread-1
pool-4-thread-1
pool-5-thread-1
……

似乎是一直在不斷新建線程池?但是這里線程池不是單例的嗎?

"threadPoolTaskExecutor-10" #120 prio=5 os_prio=0 tid=0x00007fbe48264800 nid=0x4c82 waiting on condition [0x00007fbe30dca000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000a6fc26b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)

"pool-12-thread-1" #117 prio=5 os_prio=0 tid=0x00007fbe48012800 nid=0x4c6b waiting on condition [0x00007fbe310cd000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000ee20ef18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)

"pool-11-thread-1" #113 prio=5 os_prio=0 tid=0x00007fbe38028000 nid=0x4b06 waiting on condition [0x00007fbe311ce000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000f74aa0d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)

"pool-10-thread-1" #109 prio=5 os_prio=0 tid=0x00007fbe68022800 nid=0x49e1 waiting on condition [0x00007fbe313d0000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000f74aa720> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)
回答
編輯回答
何蘇葉

沒(méi)準(zhǔn)是重復(fù)利用線程了,先新增到最大線程20個(gè),然后來(lái)一個(gè)請(qǐng)求復(fù)用就行了

2017年7月16日 20:14
編輯回答
荒城

首先,threadPoolTaskExecutor這個(gè)bean,其生成的線程名并不是pool-x-thread-x這種形式的,所以多出來(lái)且不回收的線程并非threadPoolTaskExecutor生成的。仔細(xì)排查了代碼,發(fā)現(xiàn)是本身代碼問(wèn)題(有一處操作,每次生成一個(gè)線程,并生成線程池來(lái)執(zhí)行這個(gè)線程,而這個(gè)線程池沒(méi)有被銷毀。線程池shutdown方法是無(wú)法銷毀這個(gè)池的嗎?。。)然后線程數(shù)量就爆炸了

2018年7月29日 21:34