一、线程池
1、什么是线程池?
答:
经常创建、启动销毁一个线程都是非常消耗时间的。
使用线程池进行管理和复用线程,提高程序效率。
面试答:
Java线程池能带来的3个好处:
1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2、提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
3、提高线程的可管理性。线程是稀缺资源,如果无限制地创建,
不仅会消耗系统资源。还会降低系统的稳定性。
使用线程池可以统一分配、调优和监控,但是要合理利用。
Java使用线程核心走的是ThreadPoolExecutor。(构造函数)
二、使用线程池的方式
使用线程池的方式:
使用Executor 封装好的四种线程池类型。
1、newCachodThreadPool创建一个可以缓存线程池,如果线程池长度超过处理需要
,可灵活回收空闲线程,若无可回收,则新建线程。
2、newFixedThreadPool 创建一个定长的线程池。可控制线程最大并发数,超出的
线程会在队列中等待。
3、newFixedThreadPool 创建一个定长的线程池。
4、newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作
线程来执行任务。
三、线程池合理配置
CPU密集、IO密集。
四、4种创建线程池的方式
1、newCachedThreadPool 创建可以缓存的线程池
package com.leeue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @classDesc: 功能描述:(线程池四种创建方式 newCachedThreadPool 创建可缓存的线程池)
*/
public class NewCachedThreadPoolDemo {
public static void main(String[] args) {
// 1、创建可缓存的线程池 可以重复的利用
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
int temp = i;
newCachedThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp);
}
});
}
}
}
显示结果:本来程序是创建
10
个线程,这里就创建了
7
个,说明有
3
个在复用
2、newFixedThreadPool:创建固定长度的线程池
package com.leeue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* @classDesc: 功能描述:(可固定长度的线程池 newFixedThreadPool)
*/
public class newFixedThreadPoolDemo {
public static void main(String[] args) {
//快捷键 ctrl+2 +F 来创建变量名
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);
for(int i = 0; i < 10; i++) {
int temp = i;
newFixedThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);
}
});
}
}
}
3、newScheduledThreadPool:创建可以定时执行的线程池
package com.leeue;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
*
* @classDesc: 功能描述:(创建 可定时的线程池)
*/
public class NewScheduledThreadPoolDemo {
public static void main(String[] args) {
ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3);
for(int i = 0; i < 10; i++) {
int temp = i;
newScheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);
}
}, 3, TimeUnit.SECONDS);//定时3秒后 执行这个线程池
}
}
}
4、newSingleThreadExecutor:单线程池
package com.leeue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* @classDesc: 功能描述:(单线程的线程池)
*/
public class NewSingleThreadScheduledDemo {
public static void main(String[] args) {
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
int temp = i;
newSingleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp);
}
});
}
}
}
5、停掉线程池的方法newSingleThreadExecutor.shutdown();//停掉线程池的方法
调用shoutdown()方法。
五、线程池原理分析
主要谈:核心线程池、最大线程数
核心线程满了,接下来进队列,队列也满了,创建新线程,直到达到最大线程数,之后再超出,会进入拒绝rejectedExecution