线程池应用及实现原理剖析

深入剖析Java线程池之“newScheduledThreadPool“ newScheduledThreadPool是Java线程池框架中的一个重要方法,它允许创建定时或周期性执行任务的线程池。通过深入剖析其源码和实现原理,可以更好地理解其工作机制和性能特点。同时,结合高级应用策略,可以更好地利用newScheduledThreadPool来提高系统的性能和稳定性。 阅读详情

线程池应用及实现原理剖析

1.线程池

1.1 为什么使用线程池

在这里插入图片描述

1.2线程池原理

在这里插入图片描述

1.3线程池相关API

在这里插入图片描述

1.4线程池API

方法定义(ExecutorService)
在这里插入图片描述
方法定义(ScheduledExecutorService)
在这里插入图片描述
Executors工具类
在这里插入图片描述

2.线程池原理 - 任务执行过程

在这里插入图片描述
代码示例:

import java.util.List;
import java.util.concurrent.*;

/** 线程池的使用 */
public class Demo7 {

  /**
   * 测试:提交15个执行时间需要3秒的任务,看线程池的状况
   *
   * @param threadPoolExecutor
   * @throws Exception
   */
  private void testCommon(ThreadPoolExecutor threadPoolExecutor) throws Exception {
    // 测试:提交15个执行时间需要3秒的任务,看超过大小的2个,对应的处理情况
    for (int i = 0; i < 15; i++) {
      int n = i;
      threadPoolExecutor.submit(
          new Runnable() {
            @Override
            public void run() {
              try {
                System.out.println("开始执行:" + n);
                Thread.sleep(3000L);
                System.out.println("执行结束:" + n);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
            }
          });
      System.out.println("任务提交成功:" + i);
    }
    // 查看线程数量,查看队列等待数量
    Thread.sleep(500L);
    System.out.println("当前线程池线程数量为:" + threadPoolExecutor.getPoolSize());
    System.out.println("当前线程池等待的数量为" + threadPoolExecutor.getQueue().size());
    // 等待15秒,查看线程数量和队列数量(理论上,会被超出核心线程数量的线程自动销毁)
    Thread.sleep(15000L);
    System.out.println("当前线程池线程数量为:" + threadPoolExecutor.getPoolSize());
    System.out.println("当前线程池等待的数量为:" + threadPoolExecutor.getQueue().size());
  }

  /**
   * 1、线程池信息:核心线程数量5,最大数量10,无界队列,超出核心线程数量的线程存活时间:5秒, 指定拒绝策略的
   *
   * @throws Exception
   */
  private void threadPoolExecutorTest1() throws Exception {
    ThreadPoolExecutor threadPoolExecutor =
        new ThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());
    testCommon(threadPoolExecutor);
    // 预计结果:线程池线程数量为:5,超出数量的任务,其他的进入队列中等待被执行
  }

  /**
   * 2、 线程池信息:核心线程数量5,最大数量10,队列大小3,超出核心线程数量的线程存活时间:5秒, 指定拒绝策略的
   *
   * @throws Exception
   */
  private void threadPoolExecutorTest2() throws Exception {
    // 创建一个 核心线程数量为5,最大数量为10,等待队列最大是3 的线程池,也就是最大容纳13个任务。
    // 默认的策略是抛出RejectedExecutionException异常,java.util.concurrent.ThreadPoolExecutor.AbortPolicy
    ThreadPoolExecutor threadPoolExecutor =
        new ThreadPoolExecutor(
            5,
            10,
            5,
            TimeUnit.SECONDS,
            new LinkedBlockingDeque<Runnable>(3),
            new RejectedExecutionHandler() {
              @Override
              public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                System.err.println("有任务被拒绝执行了");
              }
            });
    testCommon(threadPoolExecutor);
    // 预计结果:
    // 1、 5个任务直接分配线程开始执行
    // 2、 3个任务进入等待队列
    // 3、 队列不够用,临时加开5个线程来执行任务(5秒没活干就销毁)
    // 4、 队列和线程池都满了,剩下2个任务,没资源了,被拒绝执行。
    // 5、 任务执行,5秒后,如果无任务可执行,销毁临时创建的5个线程
  }

  /**
   * 3、 线程池信息:核心线程数量5,最大数量5,无界队列,超出核心线程数量的线程存活时间:5秒
   *
   * @throws Exception
   */
  private void threadPoolExecutorTest3() throws Exception {
    // 和Executors.newFixedThreadPool(int nThreads)一样的
    ThreadPoolExecutor threadPoolExecutor =
        new ThreadPoolExecutor(
            5, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
    testCommon(threadPoolExecutor);
    // 预计结:线程池线程数量为:5,超出数量的任务,其他的进入队列中等待被执行
  }

  /**
   * 4、 线程池信息:核心线程数量0,最大数量Integer.MAX_VALUE,SynchronousQueue队列,超出核心线程数量的线程存活时间:60秒
   *
   * @throws Exception
   */
  private void threadPoolExecutorTest4() throws Exception {

    /**
     * SynchronousQueue,实际上它不是一个真正的队列,因为它不会为队列中元素维护存储空间。与其他队列不同的是,它维护一组线程,这些线程在等待着把元素加入或移出队列。
     * 在使用SynchronousQueue作为工作队列的前提下,客户端代码向线程池提交任务时, 而线程池中又没有空闲的线程能够从SynchronousQueue队列实例中取一个任务,
     * 那么相应的offer方法调用就会失败(即任务没有被存入工作队列)。此时,ThreadPoolExecutor会新建一个新的工作者线程用于对这个入队列失败的任务进行处理
     * (假设此时线程池的大小还未达到其最大线程池大小maximumPoolSize)。
     */
    // 和Executors.newCachedThreadPool()一样的
    ThreadPoolExecutor threadPoolExecutor =
        new ThreadPoolExecutor(
            0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
    testCommon(threadPoolExecutor);
    // 预计结果:
    // 1、 线程池线程数量为:15,超出数量的任务,其他的进入队列中等待被执行
    // 2、 所有任务执行结束,60秒后,如果无任务可执行,所有线程全部被销毁,池的大小恢复为0
    Thread.sleep(60000L);
    System.out.println("60秒后,再看线程池中的数量:" + threadPoolExecutor.getPoolSize());
  }

  /**
   * 5、 定时执行线程池信息:3秒后执行,一次性任务,到点就执行
   * 核心线程数量5,最大数量Integer.MAX_VALUE,DelayedWorkQueue延时队列,超出核心线程数量的线程存活时间:0秒
   *
   * @throws Exception
   */
  private void threadPoolExecutorTest5() throws Exception {
    // 和Executors.newScheduledThreadPool()一样的
    ScheduledThreadPoolExecutor threadPoolExecutor = new ScheduledThreadPoolExecutor(5);
    threadPoolExecutor.schedule(
        new Runnable() {
          @Override
          public void run() {
            System.out.println("任务被执行,现在时间:" + System.currentTimeMillis());
          }
        },
        3000,
        TimeUnit.MILLISECONDS);
    System.out.println(
        "定时任务,提交成功,时间是:"
            + System.currentTimeMillis()
            + ", 当前线程池中线程数量:"
            + threadPoolExecutor.getPoolSize());
    // 预计结果:任务在3秒后被执行一次
  }

  /**
   * 6、 定时执行线程池信息:线程固定数量5 ,<br>
   * 核心线程数量5,最大数量Integer.MAX_VALUE,DelayedWorkQueue延时队列,超出核心线程数量的线程存活时间:0秒
   *
   * @throws Exception
   */
  private void threadPoolExecutorTest6() throws Exception {
    ScheduledThreadPoolExecutor threadPoolExecutor = new ScheduledThreadPoolExecutor(5);
    /**
     * 周期性执行某一个任务,线程池提供了两种调度方式,这里单独演示一下。测试场景一样。测试场景:提交的任务需要3秒才能执行完毕。看两种不同调度方式的区别 效果1:
     * 提交后,2秒后开始第一次执行,之后每间隔1秒,固定执行一次(如果发现上次执行还未完毕,则等待完毕,完毕后立刻执行)。
     * 也就是说这个代码中是,3秒钟执行一次(计算方式:每次执行三秒,间隔时间1秒,执行结束后马上开始下一次执行,无需等待)
     */
    threadPoolExecutor.scheduleAtFixedRate(
        new Runnable() {
          @Override
          public void run() {
            try {
              Thread.sleep(3000L);
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
            System.out.println("任务-1 被执行,现在时间:" + System.currentTimeMillis());
          }
        },
        2000,
        1000,
        TimeUnit.MILLISECONDS);

    /**
     * 效果2:提交后,2秒后开始第一次执行,之后每间隔1秒,固定执行一次(如果发现上次执行还未完毕,则等待完毕,等上一次执行完毕后再开始计时,等待1秒)。
     * 也就是说这个代码钟的效果看到的是:4秒执行一次。(计算方式:每次执行3秒,间隔时间1秒,执行完以后再等待1秒,所以是 3+1)
     */
    threadPoolExecutor.scheduleWithFixedDelay(
        new Runnable() {
          @Override
          public void run() {
            try {
              Thread.sleep(3000L);
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
            System.out.println("任务-2 被执行,现在时间:" + System.currentTimeMillis());
          }
        },
        2000,
        1000,
        TimeUnit.MILLISECONDS);
  }

  private ThreadPoolExecutor testShutdownCommon() {
    // 创建一个 核心线程数量为5,最大数量为10,等待队列最大是3的线程池,也就是最大容纳13个任务。
    // 默认的策略是抛出RejectedExecutionException异常,java.util.concurrent.ThreadPoolExecutor.AbortPolicy
    ThreadPoolExecutor threadPoolExecutor =
        new ThreadPoolExecutor(
            5,
            10,
            5,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(3),
            new RejectedExecutionHandler() {
              @Override
              public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                System.err.println("有任务被拒绝执行了");
              }
            });
    // 测试:提交15个执行时间需要3秒的任务,看超过大小的2个,对应的处理情况
    for (int i = 0; i < 15; i++) {
      int n = i;
      threadPoolExecutor.submit(
          new Runnable() {
            @Override
            public void run() {
              try {
                System.out.println("开始执行:" + n);
                Thread.sleep(3000L);
                System.err.println("执行结束:" + n);
              } catch (InterruptedException e) {
                System.out.println("异常:" + e.getMessage());
              }
            }
          });
      System.out.println("任务提交成功 :" + i);
    }
    return threadPoolExecutor;
  }

  /**
   * 7、 终止线程:线程池信息:核心线程数量5,最大数量10,队列大小3,超出核心线程数量的线程存活时间:5秒, 指定拒绝策略的
   *
   * @throws Exception
   */
  private void threadPoolExecutorTest7() throws Exception {
    ThreadPoolExecutor threadPoolExecutor = testShutdownCommon();
    // 1秒后终止线程池
    Thread.sleep(1000L);
    threadPoolExecutor.shutdown();
    // 再次提交提示失败
    threadPoolExecutor.submit(
        new Runnable() {
          @Override
          public void run() {
            System.out.println("追加一个任务");
          }
        });
    // 结果分析
    // 1、 10个任务被执行,3个任务进入队列等待,2个任务被拒绝执行
    // 2、调用shutdown后,不接收新的任务,等待13任务执行结束
    // 3、 追加的任务在线程池关闭后,无法再提交,会被拒绝执行
  }

  /**
   * 8、 立刻终止线程:线程池信息:核心线程数量5,最大数量10,队列大小3,超出核心线程数量的线程存活时间:5秒, 指定拒绝策略的
   *
   * @throws Exception
   */
  private void threadPoolExecutorTest8() throws Exception {
    // 创建一个 核心线程数量为5,最大数量为10,等待队列最大是3 的线程池,也就是最大容纳13个任务。
    // 默认的策略是抛出RejectedExecutionException异常,java.util.concurrent.ThreadPoolExecutor.AbortPolicy
    ThreadPoolExecutor threadPoolExecutor = testShutdownCommon();
    // 1秒后终止线程池
    Thread.sleep(1000L);
    List<Runnable> shutdownNow = threadPoolExecutor.shutdownNow();
    // 再次提交提示失败
    threadPoolExecutor.submit(
        new Runnable() {
          @Override
          public void run() {
            System.out.println("追加一个任务");
          }
        });
    System.out.println("未结束的任务有:" + shutdownNow.size());

    // 结果分析
    // 1、 10个任务被执行,3个任务进入队列等待,2个任务被拒绝执行
    // 2、调用shutdownnow后,队列中的3个线程不再执行,10个线程被终止
    // 3、 追加的任务在线程池关闭后,无法再提交,会被拒绝执行
  }

  public static void main(String[] args) throws Exception {
    Demo7 demo7 = new Demo7();
    //    demo7.threadPoolExecutorTest1();
    //    demo7.threadPoolExecutorTest2();
    //    demo7.threadPoolExecutorTest3();
    //    demo7.threadPoolExecutorTest4();
    //    demo7.threadPoolExecutorTest5();
    //    demo7.threadPoolExecutorTest6();
    //    demo7.threadPoolExecutorTest7();
    demo7.threadPoolExecutorTest8();
  }
}

3.线程池中线程数量确定

在这里插入图片描述

4.阿里规约中不建议使用Executors创建线程池的原因

在这里插入图片描述

在这里插入图片描述

【计算机视觉学习03】全景图像拼接 文章目录一、基本原理1.1 图像拼接的几何原理1.2 直线,圆,复杂曲线方程拟合1.3 RANSAC算法1.4 APAP算法1.5 寻找最佳拼接缝(Seam Finding)1.5.1 最大流问题1.5.2 最大流问题的增广链算法1.5.3 最大流最小割定理二、 图像拼接具体实现2.1 代码2.2 运行结果 一、基本原理 将两幅或多幅具有重叠区域的图像,通过特征匹配将具有相同的特征点(SIFT特征点)的图像拼接在一起,将来自多个不同视角拍摄的图像变换到同一视角下,拼接成一张宽视野图像。 图像拼接基础流程 阅读详情

相关推荐

VS Code + ESP-IDF:离线环境配置与示例工程编译全指南

本文详细介绍了在VS Code中离线配置ESP-IDF开发环境的完整流程。针对国内开发者常遇到的网络问题,指南提供了从Python环境准备、获取离线安装包、运行安装器到VS Code插件配置与示例工程编译的全套解决方案,确保环境搭建稳定、可控且高效。

weixin_28842367的博客 403

线程池工作原理

一、线程池默认工作流程 1、线程在有任务的时候会常见核心的线程数corePoolSize 2、当线程满了(有任务但是线程被使用完)不会立即扩容,而是放到阻塞队列中,当阻塞队列满了之后才会继续创建线程。 3、如果队列满了,线程数达到最大线程数则会执行拒绝策略。 4、当线程数大于核心线程数事,超过KeepAliveTime(闲置时间),线程会被回收,最终会保持corePoolSize个线程。 二、五种实现 1、newSingleThreadExecutor() 池里只有一条线程,如果线程因为异常而停止,会自动

promiseful的博客 4万+

常见机械臂模型不用找!Mujoco这儿都有!

高质量的模型集合,franka panda,so-arm100,ur之类的机械臂都有。常见机械臂模型不用找!Mujoco这儿都有!大概346M,网速不行的可以下载zip。

darcsdn 992

线程池核心原理分析-即将作废

一、基础概念 线程池是一种多线程的处理方式,线程池可以方便得对线程进行创建,销毁和管理。 线程池解决的问题: 1.线程池未出现前:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间,而且会消耗系统资源。 如果使用线程池:线程在run()方法执行完后,不用将其销毁,让它继续保持空闲状态,当有新任务...

sinat_34814635的博客 3035

AI与Agent赋能下的软件测试变革:面向未来测试工程师的工作方法论

AI Agent 软件测试 测试 software testing test

测试技师的自我修养 1235

Win10/Win11系统下冒险岛V128单机版一键搭建教程(含MySQL配置避坑指南)

本文提供Win10/Win11系统下冒险岛V128单机版一键搭建的详细教程,涵盖服务端部署、MySQL配置优化及常见问题解决方案。通过本指南,玩家可轻松实现单机版冒险岛的一键启动,重温经典游戏体验,同时避免常见的技术陷阱。

weixin_29261711的博客 650

深入理解线程池(详解)

线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。他的主要特点为:线程复用;控制最大并发数;管理线程。

weixin_44825912的博客 1万+

手把手教你用Arduino和开源电路DIY一个手机连接的电化学传感器(附GitHub源码)

本文详细介绍了如何利用Arduino和开源电路DIY一个手机连接的电化学传感器,成本不到300元即可复现价值数千元的专业设备。从硬件选型、电路搭建到固件开发和手机应用实现,手把手教你完成整个项目,特别适合科研人员、环境监测爱好者和理工科学生。附GitHub源码,方便快速上手和扩展功能。

weixin_42561040的博客 336

线程池工作原理深入解析

本文系统讲解了Java线程池的核心原理与实现。首先介绍了线程的生命周期,接着阐述了使用线程池的必要性:避免频繁创建销毁线程带来的性能损耗。文章详细解析了ThreadPoolExecutor的7个核心参数,包括核心线程数、最大线程数、存活时间等,并通过图示展示了线程池的工作原理(核心线程→阻塞队列→临时线程→拒绝策略)。最后给出了线程池的代码实现示例,演示了FixedThreadPool的使用方式。整篇文章深入浅出地剖析了线程池的运行机制,是理解Java并发编程中线程池管理的重要参考。

m0_70325779的博客 6666

2026实战:YOLOv11融合Swin Transformer,小目标检测精度暴涨47%

本文针对工业零件微小缺陷检测难题,提出了一种CNN与Transformer的最优融合方案。作者发现直接替换YOLOv11骨干网络为Swin Transformer会导致速度骤降69%而精度仅提升2.1%。通过大量实验,总结出三项核心设计原则:1)CNN为主、Transformer为辅;2)高层插入、浅层保留;3)模块化融合。最终提出三种渐进式融合方案,其中骨干部分替换方案(方案二)实现了小目标检测精度提升47%,推理速度仅下降8%的优异表现。文章详细解析了Swin Transformer的核心原理,提供了完

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 514

视图库对接系列(GA-T 1400)四、视图库对接系列(本级)注册

在之前的步骤中,我们已经把项目大体的架构已经写出来了。那我们就来实现注册接口。GA-T 1400中的步骤如下:这里的话,我们实现的简单点, 我们不进去鉴权,也就是设备或平台找我们注册的话,我们直接返回成功,不进行验证。如果需要鉴权的话可看我的另外一篇文档。

qq_37716298的博客 1044

一文带你清晰弄明白线程池的原理

【强制】线程资源必须通过线程池提供,不允许在程序中显示创建线程。 说明:使用线程池的好处是减少在创建和销毁线程池上所消耗的时间以及系统资源的开销,解决资源不足的问题,如果不适用线程池, 有可能造成系统创建大量同类线程而导致消耗完内存或者“过渡切换”的问题。

唐欢 1292

Pointnet++改进91:2025最新改进模块-RepMBConv模块

本文提出了一种改进PointNet++网络的方法,通过在特征提取模块中引入RepMBConv结构来提升模型性能。主要内容包括:1)理论部分介绍了RepMBConv的设计原理,包含自监督学习框架、动态上下文建模等创新点;2)详细给出了三步修改步骤:创建包含RepMBConv的Python模块、在pointnet2_utils.py中添加注意力机制、修改pointnet2_sem_seg.py主网络结构;3)代码实现展示了如何将RepMBConv集成到PointNetSetAbstraction模块中,形成Po

AIcurator的博客 275

1.1.7 线程池应用及实现原理剖析

weixin_43228497的博客 116

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

线程池应用及及实现原理剖析

线程池应用及实现原理剖析

weixin_41357524的博客 132

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

003. 线程池应用及实现原理剖析

1. 为什么使用线程池?线程池是不是越多越好? 线程在 java 中是一个对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间+销毁时间&gt...

山海守门人 202

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

多线程并发编程之线程池应用及实现原理剖析

为什么要用线程池 线程池原理 线程池API 1 为什么要用线程池 线程在jvm中是一个对象,更是操作系统的资源,线程创建或销毁都伴随开销,如果创建时间+销毁时间>执行时间,就会不合理 对象是占用堆空间,操作系统线程占用系统资源,根据java虚拟机规范,一个线程默认允许占用的最大栈空间为1M,而栈空间是从系统内存分配的,如果开辟的线程太多,将会消耗大量内存 操作系统需要频繁切换线程上下文...

yygEwing的博客 286

JAVA高性能编程专题-线程池应用及实现原理剖析

【主题】 线程池应用及实现原理剖析 【信息】 为什么要用线程池 线程是不是越多越好? 1、线程在java中是一个对象,操作系统的资源,创建、销毁需要时间。如果创建时间+销毁时间>执行时间不划算 2、java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小1M,这个栈空间是从系统内存中分配的。 3、操作系统需要频繁切换线程上下文,影响性能。 线程池原理 - 概念...

EdwardDrew的专栏 449

old《1.1.7 线程池应用及实现原理剖析》

为什么ThreadPoolExecutor使用的是BlockingQueue?参考不怕难之BlockingQueue及其实现,因为: 入队方法比如有: offer(E e):如果队列没满,立即返回true; 如果队列满了,立即返回false–>不阻塞 put(E e):如果队列满了,一直阻塞,直到队列不满了或者线程被中断–>阻塞 JDK文档对put(E e)的描述:Inserts the specified element into this queue, waiting if necess.

qq_23204557的博客 218

学习笔记 1.高性能编程 1.1.7 线程池应用及实现原理剖析

为什么要用线程池 线程池是不是越多越好? 1.线程在Java中是一个对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间+销毁时间>执行任务时间就很不合算。 2.Java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小1M,这个栈空间是需要从系统内存中分配的。线程过多,会消耗很多的内存。 3.操作系统需要频繁切换上下文(大家都想被运行),影响...

weixin_39267363的博客 208

Java线程池原理剖析和应用指南

目录Java线程池详解一、Java线程池简介池化思想池化思想的优点二、线程池的实现原理分析实现线程池需要考虑哪些问题?线程池的简单使用示例线程池原理的简单图示三、Executor详解Executor简介Executor框架的继承结构总结ExecutorExecutorService四、ThreadPoolExecutor 详解线程池的七个参数线程池的任务调度流程图示WorkThread模式和Future模式线程池的状态和内部结构线程池的关闭线程池的状态转换图工作线程`Worker``execute`方法详解

落日的博客 1800

Java 线程池:从原理到实践的全方位剖析

摘要: Java线程池通过资源复用、并发控制、任务调度标准化和系统可监控性四大核心价值,成为高并发场景的基础设施。其核心组件包括线程池管理器、工作线程、任务队列和拒绝策略,通过ThreadPoolExecutor实现完整的生命周期管理。关键参数如核心线程数、最大线程数、任务队列类型等直接影响线程池性能,需根据业务场景合理配置。任务队列和拒绝策略的选择尤为重要,需权衡吞吐量、资源消耗和任务处理优先级。深入理解线程池的体系结构和运行机制,有助于开发高效稳定的并发应用。

手心朝下的博客 1012

Linux 线程池:从原理到实践的深度解析

Linux 线程池:从原理到实践的深度解析

2401_85199775的博客 1215

浅析Java线程池实现原理及在实际业务中的实践

本文设计:线程池是什么;线程池解决的是什么问题;线程池总体设计;线程池如何维护自身状态;线程池如何管理任务(任务调度、任务缓冲、任务申请、任务拒绝);Worker线程管理(Worker线程、Worker线程增加、Worker线程回收、Worker线程执行任务);线程池业务背景;线程池实际问题;实现动态化线程池(整体设计、功能架构)等内容。

精◈彩◈猿◈笔◈记 1780

美团二面:聊聊线程池设计与原理,由表及里趣味解析

关于线程池,无论是在实际的项目开发还是面试,它都是并发编程中当之无愧的重中之重。因此,掌握线程池是每个Java开发者的必备技能。 本文将从线程池的应用场景和设计原理出发,先带大家手撸一个线程池,在理解线程池的内部构造后,再深入剖析Java中的线程池。全文大约2.5万字,篇幅较长,在阅读时建议先看目录再看内容。 一、为什么要使用线程池 在前面系列文章的学习中,你已然知道多线程可以加速任务的处理、提高系统的吞吐量。那么,是否我们因此就可以频繁地创建新的线程呢?答案是否定的。频繁地繁创建和启用新的线程不仅代

公众号:该用户快成仙了 504
上一篇: 线程的通信和封闭
下一篇: Java内存模型以及线程安全的可见性问题
海尔兵
博客等级 码龄7年 12粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值