线程池的参数的介绍
如图:
如图所示,上面的7个参数就是线程池的参数。
1. int corePoolSize 和 int maximumPoolSize 这两个参数分别为,核心线程数和最大线程数。
这里的maximumPoolSize,其实就是核心线程数 + 非核心线程数。
2. long keepAliveTime 和 TimeUnit unit 分别表示,非核心线程的最大存活时间 和 单位时间。
3. BlockingQueue<Runnable> workQueue,表示线程池中的任务队列,一般是阻塞队列,线程池会提供submit方法,把任务存放到队列中。
4. ThreadFactory threadFactory , 表示的是一个工厂类,是一种设计模式,主要是为了批量给要创建的线程设计一些属性,提前把线程的属性创建好了。
5. RejectedExecutionHandler handler ,表示拒绝策略,他是一种枚举类型,比如:当线程池中的任务队列满了,还要添加,那么他会直接抛出异常,告诉程序员。
线程池的代码案例实现
我的这个例子比较简单,容易理解。
线程池中包括,阻塞队列,创建一个线程,把任务取出来,并执行。还有,submit方法,为了把任务放到阻塞队列中。
如代码:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
class MyThreadPool{
private BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(10);
public MyThreadPool(int n){
for(int i = 0; i < n; i++){
Thread t = new Thread(() -> {
try {
while(true){
Runnable runnable = queue.take();
runnable.run();
}
}
catch (InterruptedException e){
e.printStackTrace();
}
});
t.start();
}
}
void submit(Runnable runnable) throws InterruptedException {
queue.put(runnable);
}
}
public class Demo14 {
public static void main(String[] args) throws InterruptedException {
MyThreadPool myThreadPool = new MyThreadPool(10);
for(int i = 0; i < 10; i++){
int id = i;
myThreadPool.submit(new Runnable() {
@Override
public void run() {
System.out.println("hello" + id);
}
});
}
}
}
执行结果如图:
线程池的几种创建方法
如代码:
public class Deom13 {
public static void main(String[] args) {
//创建一个普通的线程池,
//能够根据任务个数自动对线程池扩容。
ExecutorService service = Executors.newCachedThreadPool();
//创建固定个数的线程池。
Executors.newFixedThreadPool(4);
//创建一个只包含单线程的线程池。
Executors.newSingleThreadExecutor();
//创建固定线程池的个数,但任务延迟执行的线程池。
Executors.newScheduledThreadPool(4);
}
}