线程池凭什么可以提高运行效率 线程池有助于( 二 )


剩下的两种方式如果不主动shutdowm,则会一直在后台运行
scheduleAtFixedRate这种启动方式不仅能够做到延迟执行,还可以实现周期性运行
/*** @param1 Runnable command 线程任务,就是Runnable对象* @param2 long initialDelay 延迟执行时间* @param3 long period 执行的绝对间隔时间* @param4 TimeUnit unit 时间单位*/
这里是延迟1秒执行,每隔5秒再执行一次
public static void main(String[] args) {ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(5);for (int i = 0; i <10 ; i++) {System.out.println(Thread.currentThread().getName()+"加入线程池时间:"+ DateFormat.getTimeInstance().format(new Date()));scheduledThreadPool.scheduleAtFixedRate(new MyRunnable(),1000,5000, TimeUnit.MILLISECONDS);}//scheduledThreadPool.shutdown();}
注意: 间隔时间需要大于任务执行的时间,不然就会执行完任务马上就开始下一个周期
scheduleWithFixedDelay这种方式和scheduleAtFixedRate的方式很像,功能也差不多,这里就不再演示了
/*** @param1 Runnable command 线程任务,就是Runnable对象* @param2 long initialDelay 延迟执行时间* @param3 long delay 执行的相对间隔时间* @param4 TimeUnit unit 时间单位*/
scheduleWithFixedDelay和scheduleAtFixedRate的区别scheduleAtFixedRate的间隔时间是绝对的,是从任务执行开始后开始计算的,所以当执行任务时间大于间隔时间时,线程就会立马进入一个周期
scheduleWithFixedDelay的间隔时间是相对的,是从任务执行完成后开始计算的
5.手动创建线程池上面四种线程池的创建方式,都是用Executors这个类提供的静态方法创建的,然而为了能够更加准确地控制线程和节省资源,更加推荐使用手动创建线程池的方式
想要手动创建线程池,直接创建一个ThreadPoolExecutor对象就可以了
先来看看它的构造方法的参数
/*** @param1 int corePoolSize 线程池的最大核心线程数* @param2 int maximumPoolSize 线程池的最大线程数* @param3 long keepAliveTime 线程池中空闲线程的存活时长* @param4 TimeUnit unit 上一个参数的时间单位* @param5 BlockingQueue workQueue 存放任务的队列,这里使用阻塞队列* 上面是最简单的一个构造方法的参数,下面都是其他构造方法中有的*@param6 ThreadFactory threadFactory 线程池创建线程的工厂*@param7 RejectedExecutionHandler handler 线程池的控制器,用来处理任务队列和最大线程数都达到最大值,仍然有任务要加入任务队列的情况*/
这里创建了一个核心线程数为5,最大线程数为5,空闲线程的存活时长为30秒,任务队列长度为10的线程池
/** * @author xxj * 手动创建线程池 */public class ManualThreadPoolTest {public static void main(String[] args) {ExecutorService executorService=new ThreadPoolExecutor(5,5,30000, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(10));executorService.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"子线程");}});executorService.shutdown();}}
最大核心线程数和最大线程数的区别画个图出来就看到明白了

线程池凭什么可以提高运行效率 线程池有助于

文章插图
三、总结线程池的出现,就是为了解决线程反复创建的销毁带来的开销、增加线程的复用性和加强对线程可控性 。
如果想要降低资源的消耗,可以使用SingleThreadExecutor和FixedThreadPool,还有手动创建线程池
如果想要更快地执行速度,可以使用CachedThreadPool
如果想要实现定时任务,可以使用ScheduledThreadPool,但需要注意它的三种启动方式的区别
——————————————————————————————
你知道的越多,不知道的越多 。