什么是线程池?
顾名思义线程池就是线程的容器
举个例子:在没有共享电源的年代,车站有5个人手机都没电且都没有带电源,这五个人想要给手机充电只能去车站的售货亭各花100块钱买一个移动电源;但是现在共享电源出现了,假设车站现在一共有3个共享移动电源,那么其中三个人只需要花一块钱租共享移动电源充电,后面2个人等前面的人用完了,接着花1块钱租就可以了(这个例子的前提是这5个人都不赶时间的前提下)
这里的共享电源出租点就相当于线程池。
线程池可以用来干什么?
线程池就是用来管理线程的
在没有接触线程池之前,我们使用线程的时候就去创建一个线程,然后startup()就可以
假设,你现在有一个while n(n=10000)的循环,每一次循环都要启动一个线程去计算n的因数,这样频繁而且大量的创建线程,系统的效率会大幅下降,系统会很快奔溃。
线程池就可以帮助我们解决这个问题,他使线程可以重复使用,就是执行完一个任务线程不会被销毁,而是可以继续执行其他任务
java中的线程池如何使用?
// 创建一个容量为5的线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 向线程池提交一个任务(其实就是通过线程池来启动一个线程)
executorService.execute(new TestRunnable());
java中线程池的使用
java中有哪些线程池?
Java通过Executors提供四种线程池,分别为:
(1)newCachedThreadPool——创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
(2)newFixedThreadPool——创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
(3)newScheduledThreadPool——创建一个定长线程池,支持定时及周期性任务执行。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); scheduledThreadPool.schedule(
newRunnable() {
@Override
public void run () {
System.out.println("延迟三秒");
}
},3,TimeUnit.SECONDS);
scheduledThreadPool.scheduleAtFixedRate(
newRunnable() {
@Override
public void run () {
System.out.println("延迟 1 秒后每三秒执行一次");
}
},1,3,TimeUnit.SECONDS);
(4)newSingleThreadExecutor——创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
java线程池参数说明?
小程序使用这些上述快捷方法创建线程没什么问题,对于服务端需要长期运行的程序,创建线程池应该直接使用ThreadPoolExecutor
的构造方法。没错,上述Executors
方法创建的线程池就是ThreadPoolExecutor
。
ThreadPoolExecutor构造方法
Executors
中创建线程池的快捷方法,实际上是调用了ThreadPoolExecutor
的构造方法(定时任务使用的是ScheduledThreadPoolExecutor
),该类构造方法参数列表如下:
1 2 3 4 5 6 7 8 9 |
|
竟然有7个参数,很无奈,构造一个线程池确实需要这么多参数。这些参数中,比较容易引起问题的有corePoolSize
, maximumPoolSize
, workQueue
以及handler
:
corePoolSize
和maximumPoolSize
设置不当会影响效率,甚至耗尽线程;workQueue
设置不当容易导致OOM;handler
设置不当会导致提交任务时抛出异常。