参考文章:
阿里一面:那我把线程池coreSize配置成0会怎样?
方法解释:
getPoolSize:Returns the current number of threads in the pool.
getActiveCount:Returns the approximate number of threads that are actively executing tasks.
import org.scalatest.funsuite.AnyFunSuite
import java.util.concurrent.{ArrayBlockingQueue, Executors, ThreadPoolExecutor, TimeUnit}
class TreadPoolCreationTest extends AnyFunSuite {
test("ts") {
val start = System.currentTimeMillis()
// val pool:ThreadPoolExecutor=getEmptyPool()
val pool:ThreadPoolExecutor=getFixxedPool()
val end = System.currentTimeMillis()
println(f"elapsed ${(end - start).toDouble / 1000}%.2f")
printPool(pool, 3)
println("$$$$$$$$$$$$$")
pool.execute(new Runnable {
override def run(): Unit = {
Thread.sleep(3 * 1000)
}
})
printPool(pool, 10)
pool.shutdown()
}
def getEmptyPool():ThreadPoolExecutor={
val pool = new ThreadPoolExecutor(
0,
4,
2,
TimeUnit.SECONDS,
new ArrayBlockingQueue(4),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy()
)
pool
}
def getFixxedPool():ThreadPoolExecutor={
val pool = new ThreadPoolExecutor(
2,
4,
2,
TimeUnit.SECONDS,
new ArrayBlockingQueue(4),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy()
)
pool.allowCoreThreadTimeOut(true)
pool
}
def printPool(pool: ThreadPoolExecutor, elapse: Int): Unit = {
var curr: Int = 0
while (curr < elapse) {
println(
s"pool size: ${pool.getPoolSize},core pool size: ${pool.getCorePoolSize}, active pool size: ${pool.getActiveCount}, allow core thread timeout: ${pool.allowsCoreThreadTimeOut()}, maximum pool size: ${pool.getMaximumPoolSize}".stripMargin)
curr += 1
Thread.sleep(1000)
}
}
}
getEmptyPool
方法:
elapsed 0.00
pool size: 0,core pool size: 0, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 0, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 0, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
$$$$$$$$$$$$$
pool size: 1,core pool size: 0, active pool size: 1, allow core thread timeout: false, maximum pool size: 4
pool size: 1,core pool size: 0, active pool size: 1, allow core thread timeout: false, maximum pool size: 4
pool size: 1,core pool size: 0, active pool size: 1, allow core thread timeout: false, maximum pool size: 4
pool size: 1,core pool size: 0, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 1,core pool size: 0, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 0, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 0, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 0, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 0, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 0, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
getFixxedPool
方法:
elapsed 0.00
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: true, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: true, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: true, maximum pool size: 4
$$$$$$$$$$$$$
pool size: 1,core pool size: 2, active pool size: 1, allow core thread timeout: true, maximum pool size: 4
pool size: 1,core pool size: 2, active pool size: 1, allow core thread timeout: true, maximum pool size: 4
pool size: 1,core pool size: 2, active pool size: 1, allow core thread timeout: true, maximum pool size: 4
pool size: 1,core pool size: 2, active pool size: 0, allow core thread timeout: true, maximum pool size: 4
pool size: 1,core pool size: 2, active pool size: 0, allow core thread timeout: true, maximum pool size: 4
pool size: 1,core pool size: 2, active pool size: 0, allow core thread timeout: true, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: true, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: true, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: true, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: true, maximum pool size: 4
看看shutdown
之后的变化:
test("sd"){
val pool = new ThreadPoolExecutor(
2,
4,
100,
TimeUnit.SECONDS,
new ArrayBlockingQueue(4),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy()
)
printPool(pool,1)
pool.execute(new Runnable {
override def run(): Unit = {
Thread.sleep(3000)
}
})
pool.execute(new Runnable {
override def run(): Unit = {
Thread.sleep(3000)
}
})
println("after execute")
printPool(pool,1)
pool.shutdown()
println("after shutdown")
printPool(pool,10)
}
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
after execute
pool size: 2,core pool size: 2, active pool size: 2, allow core thread timeout: false, maximum pool size: 4
after shutdown
pool size: 2,core pool size: 2, active pool size: 2, allow core thread timeout: false, maximum pool size: 4
pool size: 2,core pool size: 2, active pool size: 2, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: false, maximum pool size: 4
pool size: 0,core pool size: 2, active pool size: 0, allow core thread timeout: false, maximum pool size: 4