标签:教学 execution 基础 ++ 一个 阻塞队列 视频教程 nstat 工作队列
线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。
Thread、Runnable、Callable
//实现Runnable接口的类将被Thread执行,表示一个基本任务
public interface Runnable {
//run方法就是它所有内容,就是实际执行的任务
public abstract void run();
}
//Callable同样是任务,与Runnable接口的区别在于它接口泛型,同时它执行任务候带有返回值;
//Callable的使用通过外层封装成Future来使用
public interface Callable<V> {
//相对于run方法,call方法带有返回值
V call() throws Exception;
}
注意:启动Thread线程只能用start(JNI方法)来启动,start方法通知虚拟机,虚拟机通过调用器映射到底层操作系统,通过操作系统来创建线程来执行当前任务的run方法
Executor接口是线程池框架中最基础的部分,定义了一个用于执行Runnable的execute方法。
从图中可以看出Exectuor下有一个重要的子接口ExecutorService,其中定义了线程池的具体行为:
isShutdown():是一个钩子函数,测试是否该ExecutorService是否被关闭
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
ctl:对线程池的运行状态和线程池中有效线程的数量进行控制的一个字段,它包含两部分信息:线程池的运行状态(runState)和线程池内有效线程的数量(workerCount)。
这里可以看到,使用Integer类型来保存,高3位保存runState,低29位保存workerCount。COUNT_BITS 就是29,CAPACITY 就是1左移29位减1(29个1),这个常量表示workerCount的上限值,大约是5亿。
ctl相关方法:
//获取运行状态
private static int runStateOf(int c) { return c & ~CAPACITY; }
//获取活动线程数
private static int workerCountOf(int c) { return c & CAPACITY; }
//获取运行状态和活动线程数的值
private static int ctlOf(int rs, int wc) { return rs | wc; }
线程池的状态:
RUNNING = -1 << COUNT_BITS? //高3位为111
SHUTDOWN = 0 << COUNT_BITS? //高3位为000
STOP = 1 << COUNT_BITS? //高3位为001
TIDYING = 2 << COUNT_BITS? //高3位为010
TERMINATED = 3 << COUNT_BITS? //高3位为011
1、RUNNING
2、SHUTDOWN
3、STOP
4、TIDYING
5、TERMINATED
RunTask类:
public class RunTask implements Runnable {
public void run() {
System.out.println("Thread name:"+Thread.currentThread().getName());
}
}
ExecutorSample类:
public class ExecutorSample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i=0;i<20;i++){
//提交任务无返回值
executor.execute(new RunTask());
//任务执行完成后有返回值
Future<Object> future = executor.submit(new RunTask());
}
}
}
线程池的具体使用:
ScheduledThreadPoolExecutor 定时线程池
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
线程池的监控:
public long getTaskCount() //线程池已执行与未执行的任务总数
public long getCompletedTaskCount() //已完成的任务数
public int getPoolSize() //线程池当前的线程数
public int getActiveCount() //线程池中正在执行任务的线程数量
还没关注我的公众号?
标签:教学 execution 基础 ++ 一个 阻塞队列 视频教程 nstat 工作队列
原文地址:https://www.cnblogs.com/xiaoqiang-code/p/11386612.html