1.背景
如果开发并发处理的程序,就需要使用到线程池。
2.具体
2.1 说明
一般情况下,使用线程池,需要抽象一些概念来进行划分类,具体包括三个部分:
1.线程池服务(线程大小,队列大小(缓冲用),线程生命时长,饱和策略,当然还有便于识别的线程名)
2.执行器(实现了Runnable接口)
3.任务(即Task对象)
2.2 实例
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by Administrator on 2017/8/17.
*/
public class MyThreadpool {
private static Logger logger = LoggerFactory.getLogger(MyThreadpool.class);
public static void test0() {
ExecutorService executorService = createExecutorService();
for (int i = 0; i < 10; i++) {
executorService.submit(new MyExecutor0(new Task0()));
}
try {
executorService.awaitTermination(10, TimeUnit.MINUTES);
} catch (InterruptedException e) {
logger.error("", e);
}
}
/**
* Thread Pool Service
* @return
*/
public static ExecutorService createExecutorService() {
ThreadFactory threadFactory = new ThreadFactory() {
AtomicInteger atomicInteger = new AtomicInteger(0);
public Thread newThread(Runnable r) {
return new Thread(r,
"给线程池起个好名字-" + atomicInteger.getAndIncrement());
}
};
int corePoolSize = 1;
int maximumPoolSize = 10;
long keepAliveTime = 10;
TimeUnit unit = TimeUnit.MINUTES;
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue(1);
ExecutorService executorService = new ThreadPoolExecutor(corePoolSize,
maximumPoolSize,
keepAliveTime,
unit,
workQueue, threadFactory);
return executorService;
}
/**
* Executor
*/
public static class MyExecutor0 implements Runnable {
public Task0 task0;
public MyExecutor0(Task0 task0) {
this.task0 = task0;
}
@Override
public void run() {
}
}
/**
* Task
*/
public static class Task0 {
public void doSomethting() {
//TODO 业务处理
}
}
}