Executor 是 java 5 带进来的, 这套机制称之为执行框架,围绕着 Executor 接口和它的子类接口 ExecutorService 以及实现这个两个接口的
ThreadPoolExecutor展开的java
Executors 建立 执行器框架
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
方法:线程
executor.getPoolSize(); //返回线程池的大小 executor.getActiveCount(); //返回正在执行的任务的线程数。 executor.getCompletedTaskCount(); //返回已经完成的任务任务数。 executor.getLargestPoolSize(); //返回曾同时位于线程池中的最大线程数。 /* 当即关闭。 1.再也不执行那等待的线程 2.返回等待执行的线程列表 3.正在运行的线程将继续运行 */ executor.shutdownNow(); /* 若是调用了shutdownNow() 或 shutdown() 方法 ,并执行器完成 关闭过程,将返回true 表示线程池中已经要运行的任务了,也没有等待的任务。 */ executor.isTerminated(); /* 若是调用了shutdown() 方法 ,将返回true 可能,线程池中还有正在运行的任务,和等待的任务 */ executor.isShutdown(); //将等线程池中已经提交的任务完成。会拒绝以后提交的任务,但正在运行的,和等待的任务将继续 executor.shutdown(); //当前线程将阻塞5秒。等待线程池中的任务结束。有可能过了5秒后线程池中的任务也还未结束 //返回一个布尔值,true 表示与 isTerminated 的状况同样 executor.awaitTermination(5, TimeUnit.SECONDS); //暂停线程池中的全部任务(包含正在执行中的任务和未执行的任务)。立刻关闭线程池 executor.shutdownNow();
单个线程执行器code
executor = (ThreadPoolExecutor) Executors.newSingleThreadExecutor();
固定大小的执行器2接口
executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
运行多个任务并处理第一个结果get
/* invokeAny 方法接收多个线程运行,并返回第一个完成任务而且没有抛出异常的任务执行结果 */ executor.invokeAny(Collections.emptyList());
运行多个任务,并处理全部结果it
//发送一个线程列表给执行器,并等待列表中全部任务执行完成。 executor.invokeAll(Collections.emptyList());
延时执行任务io
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(5); //线程池的大小为5 scheduledThreadPoolExecutor.schedule(() -> { }, 1, TimeUnit.SECONDS); //将延时一秒后执行任务。
若是想要在某个时间点执行,那就要本身去计算当前时间与要预期时间的差值class
周期性的执行任务List
scheduledThreadPoolExecutor.scheduleAtFixedRate(()->{},1,2,TimeUnit.SECONDS);
1 表示 任务将在 1秒后执行
2 表示 两个任务执行间隔周期为 2 秒
说明,虽然两个任务的间隔为 2 秒,但若是上一个线程的执行时间大于2秒。那么就有可能存在两个或多个线程并存
scheduledThreadPoolExecutor.scheduleWithFixedDelay(()->{},1,2,TimeUnit.SECONDS);
2 表示 上一个任务的结束时间 到下一个任务的开始时间的间隔。 说明,这个状况下。就不会存在上一个任务与下一个任务并存的状况