多线程的一些知识

AFC自动售检票系统与人工智能AI结合的关键应用方案 针对售检票、大客流管理、设备运维及服务优化提供了可落地的技术支持和实现细节,可作为地铁智慧交通项目的实践参考 阅读详情
  • 线程和进程

    进程:一个在内存中独立运行的程序,每一个进程都有自己独立的内存空间,一个进程可以创建多个线程。是操作系统分配资源的基本单位。

    线程:由进程创建,用于执行任务,一个进程最少有一个线程,可以有多个线程,线程共享进程中的数据。每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在生产一条线程或者在多条线程中切换工作时开销比进程小的多,所以线程也被称为轻量级进程。是处理器任务调度和执行的基本单位

  • 线程的三种创建方式

    • 重写thread的run方法

      Thrad thread = new Thread(){
      		@Override
      		public void run(){
      		   System.out.println(1)
      		}
      };
      thread.start();
      
    • 实现runnable

      Thread thread = new Thread(new Runnable(){
      		 @Override
      		 public void run(){
      		 		System.out.println(2)
      		 }
      });
      thread.start();
      
    • 实现callback

      Callable<Integer> callable = new Callable<Integer>(){
        	@Override
          public Integer call() throw Exception{
              return 3;
          }
      };
      FutureTask<Integer> task = new FutureTask<>(callable);
      new Thread(task).start();
      while(task.isDone()){
        try{
          System.out.println(task.get());
        }catch(InterruptedException e){
          e.printStackTrace();
        }catch(ExecutionException e){
          e.printStackTrace();
        }
      }
      
  • 线程的状态
    在这里插入图片描述

    • NEW:创建还未执行,即还没有调用start()方法
    • RUNNABLE:执行状态,调用start()方法之后进入该状态
    • BLOCKED:阻塞状态,调用start()方法之后拿不锁时的状态
    • WAITING:等待状态,调用start()方法拿到锁之后执行时发现没有资源,释放锁给其他线程,进入该状态,等到有资源之后,继续执行。
    • TIMED_WAITING:超时等待,调用start()方法拿到锁之后执行发现没有资源,释放锁给其他线程,进入超时等待状态,但是当超过设置的等待时间之后,即使拿不到资源也会继续执行。
    • TERMINATED:线程执行结束状态
  • wait和sleep的区别

    • wait

      1. 暂停当前线程,释放锁
      2. 属于Object对象
      3. wait只能在同步块中使用
      4. 可以随时唤醒
    • Sleep

      1. 暂停当前线程,不释放锁
      2. 属于线程Thread
      3. 可以在任何场景下使用
      4. 只有sleep到设置的时间才会被重新唤醒
  • 为什么使用多线程

    提高程序的处理效率。创建线程是一个开销很大,使用线程池可以避免线程创建和销毁带来的性能开销,避免大量线程因抢占系统资源而导致阻塞,能够提供对线程的简单管理,定时执行、间隔执行等。

  • 什么是线程池

    线程池的基本思想就是一种对象池,就是在程序启动的时候开辟一块空间,然后用于存放线程(未死亡),里面的线程执行调度有线程池来处理。当需要使用线程处理时,就从池中获取一个对象执行任务,执行完任务之后,再将线程池放回到线程池中,这样就避免了新建线程带来的开销,可以服务已经创建好的线程,达到节省资源的目的。

  • 线程池的主要组件

    • 线程池管理器-ThreadPool

      用于创建线程和管理线程,包括创建线程池、销毁线程池、添加任务

    • 工作线程-WorkThread

      线程池中的线程,用于执行任务,没有任务时处于等待状态

    • 任务接口-Task

      每个任务必须实现的接口,以供线程调度任务执行,它规定了任务的入口、任务的收尾工作以及任务的执行状态

    • 任务队列-taskQueue

      没有被调度的任务放入到该地方,等待工作线程调度执行,起到缓冲的作用。

  • 创建线程池的方法

    • newCachedThreadPool

      创建的是一个可缓存的线程池,如果线程池长度超过处理需要,则收回空闲线程,若无,则新建线程。

      public static void main(String[] args) {
              ExecutorService threadPool = Executors.newCachedThreadPool();
              for (int i = 0; i < 1000; i++) {
                  final int index = i;
                  try {
                      Thread.sleep(index * 1000);
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  threadPool.execute(new Runnable() {
                      @Override
                      public void run() {
                          System.out.println(Thread.currentThread().getName()+":"+index);
                      }
                  });
              }
          }
      
    • newFixedThreadPool

      创建的是一个定长的线程池,在创建时指定线程数。超出的线程会在队列里面等待。

      public static void main(String[] args) {
              ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
              for (int i = 0; i < 10; i++) {
                  final int index = i;
                  fixedThreadPool.execute(new Runnable() {
                      @Override
                      public void run() {
                          try {
                              System.out.println(Thread.currentThread().getName() + ":" + index);
                              //三个线程并发
                              Thread.sleep(2000);
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                      }
                  });
              }
          }
      
    • newScheduledThreadPool

      创建的是一个定长的线程池,支持定时周期性的执行任务

      public static void main(String[] args) {
              ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
              // 表示延迟1秒后每3秒执行一次
              scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
                  @Override
                  public void run() {
                      System.out.println(Thread.currentThread().getName() + ": delay 1 seconds, and excute every 3 seconds");
                  }
              }, 1, 3, TimeUnit.SECONDS);
          }
      
    • newSingleThreadExecutor

      创建只有1个线程的线程池,只会用唯一的工作线程执行任务,保证所有任务按照队列里的顺序(FIFO,LIFO,优先级)进行处理。

      public static void main(String[] args) {
              ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
              for (int i = 0; i < 10; i++) {
                  final int index = i;
                  singleThreadPool.execute(new Runnable() {
                      @Override
                      public void run() {
                          try {
                              System.out.println(Thread.currentThread().getName() + ":" + index);
                              Thread.sleep(1000);
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                      }
                  });
              }
          }
      
  • 创建线程池的关键类ThreadPoolExecutor

    通过分析上面四种方法的源码可以看到,其实他们都是通过ThreadPoolExecutor创建的线程池,可见ThreadPoolExecutor是创建线程池的一个关键类,他在JDK中的UML类关系图如图所示:
    在这里插入图片描述

    我们可以通过ThreadPoolExecutor来创建一个线程池

    public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue<Runnable> workQueue,
                                  ThreadFactory threadFactory,
                                  RejectedExecutionHandler handler) 
    

    通过构造函数我们可以看到创建线程池所需要的几个参数

    • corePoolSize

      线程池的基本大小,当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程。

    • maximumPoolSize

      线程池最大大小,线程池允许创建的最大线程数。如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。值得注意的是如果使用了无界的任务队列这个参数就没什么效果。

    • keepAliveTime

      线程活动保持时间,线程池的工作线程空闲后,保持存活的时间。所以如果任务很多,并且每个任务执行的时间比较短,可以调大这个时间,提高线程的利用率。

    • TimeUnit

      线程活动保持时间的单位,保持存活的时间的时间单位,可选的单位有天(DAYS),小时(HOURS),分钟(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS, 千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)。

    • workQueue

      任务队列,用于保存等待执行的任务的阻塞队列。

      BlockingQueue workQueue = null;
      workQueue = new ArrayBlockingQueue<>(5);//基于数组的先进先出队列,有界
      workQueue = new LinkedBlockingQueue<>();//基于链表的先进先出队列,无界
      workQueue = new SynchronousQueue<>();//无缓冲的等待队列,无界
      

      根据java.util.concurrent.ThreadPoolExecutor#execute源码可以看出线程池的处理流程

      #获取线程数
      int c = ctl.get();
      #1.线程数量未达到corePoolSize,则新建一个线程(核心线程)执行任务
      if (workerCountOf(c) < corePoolSize) {
      	if (addWorker(command, true))
      		return;
      	c = ctl.get();
      }
      #2.线程数量达到了corePools,则将任务移入队列等待
      if (isRunning(c) && workQueue.offer(command)) {
      	int recheck = ctl.get();
      	if (! isRunning(recheck) && remove(command))
      		reject(command);
      	else if (workerCountOf(recheck) == 0)
      		addWorker(null, false);
      }
      #3.队列已满,新建线程(非核心线程)执行任务
      else if (!addWorker(command, false))
      	#4.队列已满,总线程数又达到了maximumPoolSize,就会由(RejectedExecutionHandler)抛出异常
      	reject(command);      
      
    • threadFactory

      线程工厂,用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字,Debug和定位问题时非常又帮助。

    • RejectedExecutionHandler

      拒绝策略,当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。

      以下是JDK1.5提供的四种策略:

      ​ AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。

      ​ DiscardPolicy:丢弃任务,但是不抛出异常。

      ​ DisCardOldSetPolicy:丢弃队列最前面的任务,然后提交新来的任务。

      ​ CallerRunPolicy:由调用线程(提交任务的线程,主线程)处理该任务。

  • 线程池的状态

在这里插入图片描述

  1. 线程池的初始化状态是RUNNING,能够接收新任务,以及对已添加的任务进行处理。
  2. 线程池处在SHUTDOWN状态时,不接收新任务,但能处理已添加的任务。 调用线程池的shutdown()接口时,线程池由RUNNING -> SHUTDOWN。
  3. 线程池处在STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务。 调用线程池的shutdownNow()接口时,线程池由(RUNNING or SHUTDOWN ) -> STOP。
  4. 当所有的任务已终止,ctl记录的”任务数量”为0,线程池会变为TIDYING状态。当线程池变为TIDYING状态时,会执行钩子函数terminated()。terminated()在ThreadPoolExecutor类中是空的,若用户想在线程池变为TIDYING时,进行相应的处理;可以通过重载terminated()函数来实现。
  5. 当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。
  6. 当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。 线程池彻底终止,就变成TERMINATED状态。线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED。
  • 为什么阿里java开发手册不推荐使用Executors创建线程池,而是推荐手动创建线程池

    newFixedThreadPool和newSingleThreadExecutor主要是因为堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。

    #newSingleThreadExecutor
    public static ExecutorService newSingleThreadExecutor() {
            return new FinalizableDelegatedExecutorService
                (new ThreadPoolExecutor(1, 1,
                                        0L, TimeUnit.MILLISECONDS,
                                        new LinkedBlockingQueue<Runnable>()));
        }
     
    #newFixedThreadPool
    public static ExecutorService newFixedThreadPool(int nThreads) {
            return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue<Runnable>());
        }
    

    由源码可以看到这两个线程池都是使用LinkedBlockingQueue作为任务队列的,这个是无界的队列,即使你限制了线程数,但是任务还是会被放到队列中进行堆积,最终导致OOM。

    newCachedThreadPool和newScheduledThreadPool主要是因为最大线程数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。

    #newCachedThreadPool
    public static ExecutorService newCachedThreadPool() {
            return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                          60L, TimeUnit.SECONDS,
                                          new SynchronousQueue<Runnable>());
        }
      
    #ScheduledThreadPoolExecutor
     public ScheduledThreadPoolExecutor(int corePoolSize) {
            super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
                  new DelayedWorkQueue());
        }
    

    由源码可以看到maximumPoolSize为Integer.MAX_VALUE,这样如果任务很多的时候会导致床和非常多的线程。

欢迎关注我的公众号

android6 usb默认文件管理,不弹RSA配对提示框 本文修改针对 高通 Android6.0.1 出user版本时 https://www.cnblogs.com/Jokeyyu/p/7424262.html http://blog.youkuaiyun.com/sinc00/article/details/44957943 diff --git a/frameworks/base/packages/SystemUI/src/com/android... 阅读详情

相关推荐

silvaco(TCAD)击穿特性仿真,的不收敛问题

在silvaco仿真学习过程中,最近这段时间一直有一个很大的问题困扰着我,那就是我在仿真击穿特型曲线的过程中,在电压加到后期比较大的情况下,往往会出现仿真不收敛的情况,正常情况下器件的击穿应该在一个外加偏压上,电流出现迅速的上升,这才是击穿的定义,但是我仿真的过程中程序跑到一个较大的电压时,器件出现击穿,我观察电压电流曲线,在击穿电压(程序报告的)电流并没有出现迅速的变化,类似于下图这种形式。(2)解决方法,将初始电压调整到合适的值,这个值可能是更大的也可能是更小的,要注意多多尝试。

zm19992533002908的博客 4944

如何解决1万个并发连接,用每个客户一个线程的方法

原文链接:http://stackoverflow.com/questions/17593699/tcp-ip-solving-the-c10k-with-the-thread-per-client-approach                   一个线程一个连接支持1万个并发连接是可以做到的。但需要注意如下问题: (1)   一个线程一个客户连接,当客户退出时需要,删除线程,当新的线程

wjw7869的专栏 6232

Autodesk全家桶安装总报错1603?一个服务设置搞定3dsMax和CAD安装回滚问题

本文详细解析了Autodesk全家桶安装过程中常见的1603错误,特别是3ds Max和CAD安装回滚问题。通过调整AdskLicensingService服务的账户权限,提供四步修复法和安装流程优化策略,帮助用户彻底解决安装难题,提升Autodesk软件的安装成功率。

weixin_30955617的博客 1117

多线程知识框架总结

多线程知识框架总结

2503_90810740的博客 137

stackelberg博弈_博弈论、多智能体、强化学习(随便记点东西)

多智能体应用场景:已实现:游戏AI。正在努力:UAV,物资运输,快递分发,交通系统。未来:社会学,预测群体行为,城市区域合作,国际关系。博弈论基本定义:玩家集合: 策略集合: 收益函数: 囚徒困境:两智能体矩阵博弈坦白抵赖坦白1,13,0抵赖0,32,2占优策略与最佳应对:上表中两者均具有占优策略,即无论如何都应该选坦白。那么构造下表。坦白抵赖坦白1,13,0抵赖0,12,2对于玩家一来说,坦白...

weixin_39611722的博客 2997

SOI技术实战:从晶圆结构到芯片性能提升的完整解析

本文深入解析SOI(Silicon on Insulator)技术如何通过独特的三明治晶圆结构提升芯片性能,涵盖从220nm SOI层设计到7nm节点的工艺挑战。详细探讨了埋氧层的绝缘优势、性能提升的物理机制,以及AMD处理器和5G射频中的实战应用,为半导体行业提供关键技术洞见。

wdx0123456的博客 960

多线程基础知识点

多线程基础知识点 多线程基础必要知识点!看了学习多线程事半功倍

qq_41854398的博客 186

保姆级教程:不用看古早代码,5分钟搞懂泛微ecology9附件存储与接口调用

本文详细解析了泛微ecology9附件存储与接口调用的核心原理,提供从基础概念到实战操作的完整指南。通过拆解文档化附件设计理念、解析RESTful接口参数,并给出Python代码示例,帮助开发者快速掌握附件上传与业务集成的关键技巧,提升二次开发效率。

weixin_28688385的博客 349

多线程知识脑图

链接: 多线程知识脑图高清地址.

take it easy 222

1.Fay-UE5数字人工程导入(UE数字人系统教程)

ue5数字人系列教程(含源文件工程)

1万+

财务惊呼“不可能”!Python 自动识别 PDF 发票,数据秒级录入系统

电子发票(原生 PDF):这种最爽,文字是可以选中的。我们用 PyPDF2 直接提取文本,速度快,准确率 100%。 纸质扫描/拍照发票:这种是图片。必须上 OCR(光学字符识别)。我们要用百度开源的 PaddleOCR,这是目前中文识别效果最好的开源库之一,吊打早已过气的 Tesseract。

BUG猿的博客 1024

python多线程_Python多线程的一些知识

Python多线程的一些知识前言了更好地体验多线程爬虫,本章先介绍下需要了解的知识点,以便后续的多线程爬虫文章有更好的理解与学习。在接下来要讲的知识点中,感兴趣的读者们请先弄清楚进程和线程两者是什么?它们各自有着什么样的关系呢?读下廖雪峰老师简单介绍的例子,比喻非常生动清晰,故这里不多做讲解。进程和线程​www.liaoxuefeng.com看完后记住其中一个观念:进程是由若干线程组成的,一个进程...

weixin_39758229的博客 184

MIC:最大信息系数

目录 1. 概念 1.1 MIC 1.2 互信息 2.MIC的优点 3. 算法原理 3.1 MIC公式原理 3.2MIC计算步骤 (1)计算最大互信息值 (2)对最大的互信息值进行归一化 (3)选择不同尺度下互信息的最大值作为MIC值 4. 代码实现 6. 其他方法 1. 概念 1.1 MIC MIC,即(Maximal Information...

满腹的小不甘 5万+

多线程知识点总结

原文地址https://www.jianshu.com/p/2f1c94551038 多线程一直都是面试高级的必问高发区,并且很难掌握。特别是对于客户端的同学,因为我们在写客户端时,虽然会使用多线程场景,但不会有后端那种强要求高并发的场景。但这并不应该成为掌握不好多线程的借口,以下是我总结的思维导图,通过这个思维导图我们能更加清晰的理解多线程的知识框架 ...

杨殿生的博客 417

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

思维导图系列之Java多线程知识梳理

上一系列:思维导图系列之MySQL知识梳理 从多线程的基础、线程同步、线程间通信、线程调度、线程池、并发容器、线程安全的集合、原子变量等方面去罗列主要知识点,以思维导图的方式进行呈现,可以让读者更条理清晰的在最短的时间内掌握多线程的主要知识 下一系列:思维导图系列之Java集合知识梳理 ...

Solin的博客 1399

深度学习工具包 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")

多线程知识总结

多线程知识总结

weixin_63491196的博客 229

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JAVA多线程知识图谱

java多线程知识图谱。

菩提本无树 明镜亦非台 本来无一物 何处惹尘埃 404

【Java多线程】1——多线程知识回顾

在一个进程中,需要同时处理多个不同任务,每一个任务由一个线程来执行。从这个意义上来说,可以把进程看做是线程的容器。

一棵灬大树的博客 1087

多线程的基础知识以及应用

什么是多线程、创建线程的三种方式、守护线程、线程的生命周期、线程的安全问题、线程池的使用

m0_68201836的博客 757

Java多线程知识点总结

弱水三千、先干为敬 167

多线程基础体系知识清单

前言 本文会介绍Java中多线程与并发的基础,适合初学者食用。 线程与进程的区别 在计算机发展初期,每台计算机是串行地执行任务的,如果碰上需要IO的地方,还需要等待长时间的用户IO,后来经过一段时间有了批处理计算机,其可以批量串行地处理用户指令,但本质还是串行,还是不能并发执行。 如何解决并发执行的问题呢?于是引入了进程的概念,每个进程独占一份内存空间,进程是内存分配的最小单位,相互间运行...

Java笔记虾 2467

多线程相关知识点系统整理

摘要: 本文系统梳理了多线程编程的核心知识点。首先介绍了程序、进程、线程的基本概念及区别,阐述了单核与多核CPU的执行方式。详细讲解了三种线程创建方法:继承Thread类、实现Runnable接口和实现Callable接口,并比较了它们的优缺点。重点说明了线程特性、共享资源处理、同步机制及常用工具类(如CountDownLatch)。此外,还介绍了Lambda表达式简化线程创建的方法和常用Lombok注解。全文涵盖了从基础概念到高级特性的完整知识体系,为开发者提供了全面的多线程编程参考。

林冬的博客 713

多线程知识

 一、问题的提出编写一个耗时的单线程程序:  新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下: void CSingleThreadDlg::OnSleepSixSecond() { Sleep(6000); 

yinmingli的专栏 1492

多线程知识整理归纳总结

多线程基础知识 1. 线程的使用 1.1 线程的实现方式 1> 继承Thread类 2>实现Runnable 3> 实现Callable接口 ​ Thread类本质是实现了Runnable接口的一个实例,代表一个线程的实例。 ​ 启动方式是通过Thread类的start()方法,start()方法是一个native方法,启动一个新线程,并执行run方法 ​ 方式1.继承Thread类 1> 定义一个类MyThread继承Thread类 2> 在MyThread类

qq_43661841的博客 254

多线程知识体系

多线程知识体系 知识体系 基础概念 线程概念 进程概念 线程概念 进程线程对比 参考资料 《Java 多线程编程核心技术》高洪岩 机械工业出版社 《Java 并发编程核心方法与框架》高洪岩 机械工业出版社 ...

走在命运的左岸 510

多线程重点知识(个人整理笔记)

多线程知识点,个人整理笔记

m0_51935980的博客 1189
上一篇: Nginx相关面试题
下一篇: 3.Spring Cloud构建微服务架构(三)分布式配置中心(动态刷新)
工程师小哥
博客等级 码龄10年 4粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值