• 线程池介绍与应用


    package com.ctyun.thread.concurrent;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @Description TODO
     * @author zhanghw
     * @since 2015年12月12日
     * @version V1.0
     */
    
    public class ThreadPoolDemo {
        public static void main(String[] args) {
            /**
             * 创建一个固定大小的线程池
             */
            // ExecutorService threadPool = Executors.newFixedThreadPool(3);
            /**
             * 创建一个缓存线程池,线程池大小会随着线程任务的多少儿变化。(会自动回收已执行完毕的线程)
             */
            // ExecutorService threadPool = Executors.newCachedThreadPool();
            /**
             * 创建一个只有一个线程的线程池
             */
            ExecutorService threadPool = Executors.newSingleThreadExecutor();
    
            for (int i = 0; i < 10; i++) {
                final int taskLoop = i;
                threadPool.execute(new Runnable() {
                    @Override
                    public void run() {
                        for (int i = 0; i < 10; i++) {
                            try {
                                Thread.sleep(2000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            System.out.println(Thread.currentThread().getName() + " ,the loop is:" + i + ",the task is" + taskLoop);
                        }
                    }
                });
            }
    
            System.out.println("all task has commited!");
            /**
             * 在线程执行完毕之后,程序不会结束,因为线程池中还有三个线程 可以调用threadPool.shutdown()方法,对已经执行完毕的线程进行清理(即杀死所有的线程),并结束任务
             */
    
            // threadPool.shutdown();//当所有线程都执行完毕时,清除线程
            // threadPool.shutdownNow();//不管线程池中线程中任务是否结束,都清除线程池中所有线程
    
            /**
             * 创建一个定时任务调度的线程池
             */
            ScheduledExecutorService threadPool2 = Executors.newScheduledThreadPool(3);
         //scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
    //创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,
    //然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。
         //只执行一次的任务 threadPool2.schedule(
    new Runnable() { @Override public void run() { System.out.println("boning"); } }, 1L, TimeUnit.SECONDS); } }

    ScheduledExecutorService#scheduleAtFixedRate() 指的是“以固定的频率”执行,period(周期)指的是两次成功执行之间的时间
    比如,scheduleAtFixedRate(command, 5, 2, second),第一次开始执行是5s后,假如执行耗时1s,那么下次开始执行是7s后,再下次开始执行是9s后

    而ScheduledExecutorService#scheduleWithFixedDelay() 指的是“以固定的延时”执行,delay(延时)指的是一次执行终止和下一次执行开始之间的延迟
    scheduleWithFixedDelay(command, 5, 2, second),第一次开始执行是5s后,假如执行耗时1s,执行完成时间是6s后,那么下次开始执行是8s后,再下次开始执行是11s后

  • 相关阅读:
    java处理图片压缩、裁剪
    List按对象元素自定义排序
    List和数组汉字简单排序(转)
    欢迎访问我的个人博客,部分文章迁移
    Java资源免费分享,每日一更新,找到你心仪的吧
    今年的校招,Java好拿offer吗?
    【拥抱大厂系列】几个面试官常问的垃圾回收器,下次面试就拿这篇文章怼回去!
    2019,我的这一年,在校研究生做到年入20W,另送我的读者2000元现金红包
    深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析
    深入理解Java虚拟机-常用vm参数分析
  • 原文地址:https://www.cnblogs.com/zhangshiwen/p/5042314.html
Copyright © 2020-2023  润新知