一、简介
好吧。坑爹了,我以为JDK里面没有线程池这种东西,之前就随便写了一个,应用到线上系统了。
结果最近不经意的发现了这个东西。开始悔过认错。给大家简单介绍一下这个吧。
二、Java线程池(二)
所说的线程池(二)就是这个java.util.concurrent包下的ThreadPoolExecutor
他的作用就是使用可能的几个池线程之一执行每个提交的任务
线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法。每个 ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数。
三、介绍使用咯
JDK中推荐的使用方式是较为方便的 Executors 工厂方法 Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、Executors.newFixedThreadPool(int)(固定大小线程池)和 Executors.newSingleThreadExecutor()(单个后台线程)
属性中有一个corePoolSize 表示初始大小设置。
maximumPoolSize 表示最大数量设置。
线程池使用execute()方法来提交线程操作。
并且这个线程池还提供了beforeExecute() 和 afterExecute 这两种方法分别在执行每个任务之前和之后调用。它们可用于操纵执行环境。
四、简单例子
package com.immomo.test.bean;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
public class MongoTest {
public void start(){
int threadPoolSize = 800;
// 固定大小线程池 //800
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(threadPoolSize);
// 创建线程工厂
ThreadFactory threadFactory = Executors.defaultThreadFactory();
for (int i = 0; i < threadPoolSize; i++) {
try {
Thread thread = threadFactory.newThread(new SystemOutPrintThread());
executor.execute(thread);
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MongoTest test = new MongoTest();
test.start();
}
}
class SystemOutPrintThread implements Runnable{
@Override
public void run() {
while (true) {
System.out.println("[Andy] 乱打印一点垃圾信息咯~~");
}
}
}
乱写了800个死循环线程都扔进去了- - 哈哈哈。。
好了就这样了 大家看着玩吧~~ 下午好