day08-多线程

1.创建线程

首先讲一下Thread的构造器

Thread():创建新的Thread对象    new 自己创建得继承Thread得类
Thread(String threadname):创建线程并指定线程实例名
Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接
口中的run方法     里面放的是实现Runnable接口的线程类
Thread(Runnable target, String name):创建新的Thread对象
Thread的方法:
void start(): 启动线程,并执行对象的run()方法
run(): 线程在被调度时执行的操作
String getName(): 返回线程的名称
void setName(String name):设置该线程名称
static Thread currentThread(): 返回当前线程。在Thread子类中就是this,通常用于主线程和Runnable实现类
static void yield():线程让步
暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程
若队列中没有同优先级的线程,忽略此方法
join() :当某个程序执行流中调用其他线程的 join() 方法时,调用线程将被阻塞,直到 join() 方法加入的 join 线程执行完为止
低优先级的线程也可以获得执行
static void sleep(long millis):(指定时间:毫秒)
令当前活动线程在指定时间段内放弃对CPU控制,使其他线程有机会被执行,时间到后重排队。
抛出InterruptedException异常
stop(): 强制线程生命期结束,不推荐使用
boolean isAlive():返回boolean,判断线程是否还活着

方式一:继承Thread类

1.继承Thread类 2.重写run方法  3.创建对象   4.调用start方法

//两个线程输出1-100之间奇偶数
    //线程一:输出奇数

class MyThread1 extends Thread{            //1.继承Thread
    @Override
    public void run() {                    //2.重写run方法
        for (int i = 0; i < 100; i++) {
            if (i%2!=0){
                System.out.println(i+"线程1");
            }
        }
    }
}
//线程2:输出偶数
class MyThread2 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i%2==0){
                System.out.println(i+":线程2");
            }
        }
    }
}
//主线程
public class MyThread {
    public static void main(String[] args) {
        MyThread1 mth1 = new MyThread1();        //3.创建对象
        MyThread2 mth2 = new MyThread2();

        mth1.start();                            //4.调用.start方法
        mth2.start();
    }
}

方式二:实现Runnable接口

1.实现Runnable接口  2.重写run方法  3.通过Thread类的构造器创建对象  4.将含Runnable接口的对象作为参数传给Thread类构造器中   5.调用Thread类的start方法

//通过Runnable接口实现多线程
class Runnable1 implements Runnable{            //1.实现Runnable接口
    private String name;

    public Runnable1(String name) {
        this.name = name;
    }



    @Override
    public void run() {                         //2.重写run方法
        for (int i = 0; i < 5; i++) {
            System.out.println(name +":"+i);
            try {
                Thread.sleep((int) (Math.random()*10));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

//main方法
public class MyRunnable{
    public static void main(String[] args) {
        Runnable1 run1 = new Runnable1("A");
        Runnable1 run2 = new Runnable1("B");

        Thread aaa =new Thread(run1);
        aaa.start();

        new Thread(new Runnable1("c")).start();//3.new Thread类构造器   4.含Runnbale接口的对象作为参数传给Thread类构造器   5调用.start方法

    }
}

Runnable和Thread实现多线程的区别:

1.Runnable可以实现资源共享,创建一个Runnable接口的对象,这个对象作为一个参数传进Thread类里面两次,创建两个线程,但是两个线程执行的都是同一个任务,而Thread每创建一个类就是一个任务,不能实现资源共享

2.Thread是单继承,有局限性

方式三:实现callable接口

1.创建实现callable接口的实现类

2.重写call方法

3.创建接口实现类的对象

4.对象作为参数传给futuretask可以得到返回值,

5.futuretask作为参数传给线程类,完成线程的创建

/**
 * @author zkx
 * @create 2022-02-03 22:48
 */
public class CallableTest {
    public static void main(String[] args) {
        //3.创建实现callable接口的实现类的对象
        Numbe nn = new Numbe();

        //4.将对象作为参数传给FutureTask,    FutureTask可以得到callable的返回值
        FutureTask futureTask = new FutureTask(nn);

        //5.将futureTask对象作为参数传给线程类,实现线程的创建
        Thread t = new Thread(futureTask);
        t.start();
        
        
        //利用futureTask得到callable的返回值
        try {
            Object num = futureTask.get();
            System.out.println("总和为:"+num);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

}

//1.创建实现callable接口的实现类
class Numbe implements Callable{
    private int num;

    //2.重写call方法
    @Override
    public Object call() throws Exception {
        for (int i = 1; i <= 100; i++) {
            if(i%2==0) {
                System.out.println(i);
                num += i;
            }
        }
        return num;
    }
}
与使用Runnable相比, Callable功能更强大些
        相比run()方法,可以有返回值
        方法可以抛出异常
        支持泛型的返回值
        需要借助FutureTask类,比如获取返回结果
Future接口
        可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。
        FutrueTask是Futrue接口的唯一的实现类
        FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值
方式四:使用线程池、
1.首先创建线程池  
ExecutorService executorService = Executors.newFixedThreadPool(10);

2.执行线程

executorService.execute(number1);//execute适用于Runnable接口
executorService.submit();//submit适用于callable接口

3.关闭线程池

executorService.shutdown();
public class ExecutorsTest {
    public static void main(String[] args) {
        //1。首先创建一个线程池,里面有十个可用线程,ExecutorService是接口继承于Executors是工具类
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        //ThreadPoolExecutor是ExecutorService的一个子类
        ThreadPoolExecutor service = (ThreadPoolExecutor) executorService;
        service.setCorePoolSize(15);
        service.setMaximumPoolSize(10);
//        service.setKeepAliveTime(l);


        Number1 number1 =new Number1();
        Number2 number2 =new Number2();
        //2.执行线程,但是线程执行的方法需要自己写
        executorService.execute(number1);//execute适用于Runnable接口
        executorService.execute(number2);
//        executorService.submit();//submit适用于callable接口

        //3.关闭连接池
        executorService.shutdown();

    }
}

class Number1 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i%2==0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}

class Number2 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i%2!=0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}
背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。
思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。
好处:
        提高响应速度(减少了创建新线程的时间)
        降低资源消耗(重复利用线程池中线程,不需要每次都创建)
        便于线程管理
        corePoolSize:核心池的大小
        maximumPoolSize:最大线程数
        keepAliveTime:线程没有任务时最多保持多长时间后会终止
线程池相关API
JDK 5.0起提供了线程池相关API:ExecutorService 和 Executors
ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor
        void execute(Runnable command) :执行任务/命令,没有返回值,一般用来执行Runnable
        <T> Future<T> submit(Callable<T> task):执行任务,有返回值,一般又来执行Callable
        void shutdown() :关闭连接池
Executors:工具类、线程池的工厂类,用于创建并返回不同类型的线程池
         Executors.newCachedThreadPool():创建一个可根据需要创建新线程的线程池
        Executors.newFixedThreadPool(n); 创建一个可重用固定线程数的线程池
         Executors.newSingleThreadExecutor() :创建一个只有一个线程的线程池
         Executors.newScheduledThreadPool(n):创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行


2.同步问题

解决同步的方法:

1.同步代码块

synchronized(同步监视器){

需要被同步的代码

}

//例子:创建个窗口卖票,总票数为100张.使用实现Runnable接口的方式
    //main方法
public class SaleTicket {
    public static void main(String[] args) {
        Ticket t1 = new Ticket();


        Thread thr1 =new Thread(t1);
        Thread thr2 = new Thread(t1);
        thr1.setName("A");
        thr2.setName("B");


        thr1.start();
        thr2.start();
    }

}

class Ticket implements Runnable{
    private static int TICKET_NUM =100;//总票数为100
    @Override
    public void run() {

            while (true){
                synchronized (this){//如果是继承的话,就不能用this,需要用Ticket.class
                    if (TICKET_NUM>0){
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+"窗口:售票,票号为"+TICKET_NUM);
                        TICKET_NUM--;
                    }
                    else {
                        break;
                    }
                }

            }
    }
}

2.同步方法

public synchronized void 同步方法(){

需要被同步的代码

}

//例子:创建个窗口卖票,总票数为100张.使用实现Runnable接口的方式
    //main方法
public class SaleTicket {
    public static void main(String[] args) {
        Ticket t1 = new Ticket();


        Thread thr1 =new Thread(t1);
        Thread thr2 = new Thread(t1);
        thr1.setName("A");
        thr2.setName("B");


        thr1.start();
        thr2.start();
    }

}

class Ticket implements Runnable{
    private static int TICKET_NUM =100;//总票数为100
    @Override
    public void run() {

            while (true){
                show();//同步方法

            }
    }

    //同步方法
    public synchronized void show(){//这是接口实现同步的方法,如果是继承的话,需要static静态的

            if (TICKET_NUM>0){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"窗口:售票,票号为"+TICKET_NUM);
                TICKET_NUM--;
            }
    }
}

3.lock锁

1.创建锁 ReentrantLock lock = new ReentrantLock()

try{

        2.使用锁 lock.lock()

}finally{

        3.解锁  lock.unlock()

}

//例子:创建个窗口卖票,总票数为100张.使用实现Runnable接口的方式
    //main方法
public class SaleTicket {
    public static void main(String[] args) {
        Ticket t1 = new Ticket();


        Thread thr1 =new Thread(t1);
        Thread thr2 = new Thread(t1);
        thr1.setName("A");
        thr2.setName("B");


        thr1.start();
        thr2.start();
    }

}

class Ticket implements Runnable{
    private static int TICKET_NUM =100;//总票数为100
    private ReentrantLock lock = new ReentrantLock();   //创建lock锁
    @Override
    public void run() {

            while (true){
                try{
                    lock.lock();                        //使用lock锁方法
                    if (TICKET_NUM>0){
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+"窗口:售票,票号为"+TICKET_NUM);
                        TICKET_NUM--;
                    }else{
                        break;
                    }
                }finally{
                    lock.unlock();                      //解锁
                }


            }
    }


}

3.线程通信

wait()  阻塞当前线程,并释放锁

notify()唤醒一个阻塞的线程

notifyall()唤醒所有阻塞的线程

以上三个方法的调用者必须是 同步监视器

/**线程通信
 *
 *
 * @author zkx
 * @create 2022-02-03 22:20
 */

//使用两个线程打印 1-100。线程1, 线程2 交替打印
public class CommunicationTest {
    public static void main(String[] args) {
        Number nb = new Number();

        Thread t1 = new Thread(nb);
        Thread t2 =new Thread(nb);
        t1.setName("线程A");
        t2.setName("线程B");

        t1.start();
        t2.start();
    }

}

class Number implements Runnable{
    private int num =1;

    @Override
    public void run() {
        while (true){

            synchronized (this){
                notify();//没有阻塞的线程拿到锁之后,唤醒阻塞的线程
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (num<=100){
                    System.out.println(Thread.currentThread().getName()+":"+num);
                    num++;
                    
                    try {
                        wait();//打印完了,当前线程阻塞,并释放锁
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                }else {
                    break;
                }
            }

        }
    }
}

STM32笔记:高精度脉冲宽度计 双输入捕获+DMA方式 本文介绍如何用STM32F107VC实现高精度的脉冲宽度计(测量周期脉冲的占空比)。 采用定时器的外部输入捕获功能,双输入+DMA方式,追求硬件的极限表现。 阅读详情

相关推荐

金蝶ERP元数据解析:字段属性与表结构映射实战

本文深入解析金蝶ERP元数据的核心价值与应用实践,详细介绍了字段属性与表结构映射的关键技术。通过缓存获取与工具类直连两种方案对比,结合实际案例展示元数据在数据库校验、动态表单生成等场景的应用,帮助开发者高效解决二次开发中的常见问题。

weixin_33738555的博客 433

多线程-day08

在运行一个简单的Java程序的时候,就已经存在了两个线程,一个是主线程,一个是后台线程——维护的垃圾回收。Java程序允许使用任何对象作为同步监听对象,一般的,我们把当前并发访问的共同资源作为同步监听对象,比如此时三个线程的共同资源Apple对象。在这里,打印苹果的编号和苹果数量的减少,应该是一个原子操作,也就说是一个不能分割的操作,两个步骤之间不能被其他线程插一脚。只有调用了线程对象的start方法才会开启一个新的线程,如果是直接调用对象的run方法不会开启新的线程,只是一个单线程。

Qhuqtsp的博客 111

h5页面调用微信JS-SDK分享到微信好友或者朋友圈的配置

1.引入js &lt;script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"&gt;&lt;/script&gt; 2.在页面添加配置 &lt;script type="text/javascript"&gt; var url = location.href..

tiantiandashi的博客 2万+

多线程学习Day08

让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式,它的典型实现就是线程池,也体现了经典设计模式中的享元模式。例如,海底捞的服务员(线程),轮流处理每位客人的点餐(任务),如果为每位客人都配一名专属的服务员,那么成本就太高了(对比另一种多线程设计模式:Thread-Per-Message)注意,不同任务类型应该使用不同的线程池,这样能够避免饥饿,并能提升效率。

weixin_45906118的博客 1391

手把手教你用scRNA-seq和scTCR-seq分析CD8⁺ T细胞在免疫治疗中的动态变化

本文详细介绍了如何整合单细胞RNA测序(scRNA-seq)与单细胞TCR测序(scTCR-seq)技术,深入解析CD8⁺ T细胞在癌症免疫治疗中的动态变化。通过从数据预处理、细胞亚群鉴定到TCR克隆追踪的完整分析流程,揭示了T细胞的功能状态转变与克隆演化规律,为理解免疫应答机制和开发精准治疗策略提供了关键方法学指导。

p8q9r0的博客 567

Claude Desktop Cowork国内实操指南:本地文件自动化办公

大语言模型正从‘问答式AI’迈向‘执行型协作者’,其核心能力在于直接操作本地文件、调用系统工具并嵌入真实工作流。Claude Desktop的Cowork模式正是这一范式的代表,它通过轻量沙箱VM实现对Excel、PPT、PDF、音视频等办公资产的读写与处理,无需手动编码即可完成数据清洗、会议纪要生成、自动化报告输出等任务。技术价值体现在权限可控、环境隔离、结果可交付;典型场景覆盖行政文秘的文档流转、销售运营的数据分析、开发者的脚本调试与环境验证。本文聚焦国内用户高频卡点——网络链路、系统权限与工作流断层,

weixin_30617737的博客 468

多线程与高并发day08

个人学习笔记,仅供参考!欢迎指正!

yz1925506412的博客 173

yolov5直接调用zed相机实现三维测距(python)

zed代码比较简洁,但是一定要把环境配置好,后续自己会把他当做普通双目标定,去对比分析效果,并完善相关功能。

积极向上的mr.d的博客 1万+

Java学习——Day08:多线程

1.线程简介 多任务:看起来是多个任务同时在做,其实本质上同一时间只做一件事,切换很快导致看起来同时多了多件事。 多线程:多条线路同时做多件事情,多条执行路径,主线程和子线程并行交替执行。 程序:程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。 进程:是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。 线程:一个进程中可以包含多个线程,线程是CPU调度和执行的单位。 【注意】:很多多线程是模拟出来的,真正的多线程是指有多个CPU,即多核,如服务器。如果是模拟出来的多

zxzx666的博客 252

7、复杂分布式水文模型的两阶段代理参数校准框架

本文提出了一种针对复杂分布式水文模型的两阶段代理参数校准框架,旨在解决可变入渗能力模型(VIC)在参数校准过程中计算成本高、耗时长的问题。该框架结合AdaBoost与反向传播神经网络(BPNN)构建高精度代理模型,并引入ε-NSGA II多目标优化算法加速搜索最优参数集。通过在兰江流域和湘江流域的实验验证,该方法在校准效率上提升了约20倍,同时保持了高模拟精度(NSE接近1,Bias接近0)。框架采用两阶段设计:第一阶段(SM-I)快速筛选关键参数范围,第二阶段(SM-II)进行高精度预测,显著减少了无效计

apple5的专栏 87

深入理解Android音视频同步机制(三)NuPlayer的avsync逻辑

本文深入介绍了NuPlayer的avsync逻辑和原理

张晖的专栏 1万+

多线程储户存钱问题day08

package com.xujy.thread; /**  * 有两个储户,每次向同一个账户存钱,一次存1000,各存了三次,打印出账户的余额,采用多线程的方式,保证线程是安全的  * @author Administrator  *  */ public class AccountMoney {     public static void main(String[] args) {      ...

xujy的博客 435

DeepSeek Harness“一切皆插件”核心机制详解

DeepSeek Harness 的“一切皆插件”核心 = Cordis 微内核 + 服务化能力接口 + 声明式依赖注入 + 类型化事件 + 可逆副作用 + 配置层 Profile/Bundle/Patch 组合。它的工程收益是:把模型、工具、循环、存储、UI 等所有 Agent 能力都变成“可从配置替换、可干净装卸”的单元,而不是写死在框架里。

软件行业技术文化交流。 600

linux 学习 day08 多线程

linux 多线程学习

m0_51262652的博客 504

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

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

Day08_Java的多线程

​。

焰之游戏的博客 316

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JAVA学习(day08多线程)

1.多线程的理解 程序:为完成特定任务、用某种语言编写的一组指令的集合。即指一 段静态的代码,静态对象。 进程:程序的一次执行过程,或是正在运行的一个程序。是一个动态 的过程:有它自身的产生、存在和消亡的过程。程序是静态的,进程是动态的;进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域 线程:进程可进一步细化为线程,是一个程序内部的一条执行路径。 若一个进程同一时间并行执行多个线程,就是支持多线程。线程作为调度和执行的单位,每个线程拥有独...

qq_40820859的博客 129

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

2021-08-03 复习 java进阶 day11-多线程

复习 java进阶 day11-多线程1.实现多线程1.1进程和线程【理解】1.2实现多线程方式一:继承Thread类【应用】1.3设置和获取线程名称【应用】1.4线程优先级【应用】1.5线程控制【应用】1.6线程的生命周期【理解】1.7实现多线程方式二:实现Runnable接口【应用】2.线程同步2.1卖票【应用】2.2卖票案例的问题【理解】2.3同步代码块解决数据安全问题【应用】2.4同步方法解决数据安全问题【应用】2.5线程安全的类【理解】2.6Lock锁【应用】3.生产者消费者3.1生产者和消费者模

小虫虫的博客 801

多线程-day-08多线程和线程并发工具总结

目录 多线程和线程并发工具总结 线程基础、线程之间的共享协作 基础概念 Java线程 线程常用方法和线程状态 共享线程 线程间协作 线程并发工具类 Fork-Join分而治之、工作密取 Fork-Join标准范式 Fork-Join运用案例 常用并发工具类 4.1 CountDownLatch 4.2 CyclicBarrier ...

Xgx120413的专栏 1335

Java 进阶day08 线程、多线程、线程安全、线程状态

Java day08 线程、多线程、线程安全

weixin_44504809的博客 213

黑马程序员——javase进阶——day08——异常,多线程,Lambda,Stream,File,递归

异常就是程序出现了不正常情况 , 程序在执行过程中 , 数据导致程序不正常 , 最终导致了JVM的非正常停止注意 : 语句错误不算在异常体系中当JDK中的异常类型,不满足实际的业务需要时。就可以自己定义异常。例如,学生的年龄数据,如果是负数或者数据 超过了150认为是不合法的,就需要抛出异常。JDK中就没有表示年龄的异常,就需要自己定义异常了如果要自定义编译时异常,就继承Exception如果要自定义运行时异常,就继承RuntimeException是指从软件或者硬件上实现多个线程并发执行的技术。

qq_56444564的博客 1146

Java多线程Day08-多线程之线程join()方法

线程的join方法基本概念join源码join运行流程 基本概念 join() 定义在Thread.java中 join() 的作用 : 让主线程等待子线程结束之后才能继续运行 join源码 /** * 等待millis毫秒后线程结束.如果值为0则表示永久等待 * * 该实现使用循环的wait调用条件为isAlive的方法 * 当一个线程结束时会调用notifyAll方法 * 建议不要在线程实例上使用wait,notify和notifyAll方法

攻城狮Chova的博客 420

JAVA SE学习day_08:TCP通信、多线程(并联)

为了解决在程序中不同客户端在同一服务端中都可以进行数据发送的情况,要使用多线程将其进行并联操作 一、多线程 线程可以并发执行多个代码片段,使得这些代码片段直接运行是互不干涉的; 创建线程有两种方式, 方式一: 继承Thread类并重写run方法 * 注:run方法的内容就是该线程要执行的任务 第一种创建线程的方式的优点是定义简单,适合匿名内部类形式创建 缺点主要有两个: 1:java是单继承的,这导致继承了Thread就无法再继承其他类取复用方法了,这在 实际开发中很不方便 2:将任务定义在线程中,会

litter_m的博客 289

Day08-多线程(02)

qq_62837651的博客 164

2022/08/02 学习笔记 (day22) 多线程

对象的方法的实现方法的调用者,不需要再进行任何的线程安全的保障措施。多个线程需要共享数据,但是这些数据又可以在单独的线程中计算,得出结果 我们可以把共享数据的可见范围限制在一个线程之内,这样就无需同步。把共享的数据拿过来, 我用我的,你用你的,从而保证线程安全。CPU分为三级缓存:每个CPU都有L1,L2缓存,但是L3缓存是多核公用的。进一步优化,CPU每次读取一个数据,读取的时与它相邻的64个字节的数据。在CPU处理内存数据时,如果内存运行速度太慢,就会拖累CPU的速度。从CPU到内存,60-80纳秒。.

Dshuai7191的博客 302

python16_day08【异常、多线程】

一、反射及相关   1.isinstance(obj, cls)   检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo)   2.issubclass(sub, super)   检查sub类是否是 super 类的派生类 class Foo(...

weixin_30485291的博客 100

day08 多线程socket 编程,tcp粘包处理

复习下socket 编程的步骤: 服务端: 1 声明socket 实例 server = socket.socket() #括号里不写 默认地址簇使用AF_INET 即 IPv4 默认type 为 sock.SOCK_STREAM 即 TCP/IP 协议 2 绑定IP地址和端口 server.bind(('localhost',9999)) #ip地址和...

weixin_30502965的博客 142
上一篇: day07-异常
下一篇: day09-JAVA常用类、String、StringBuffer、StringBuilder、时间API
m0_62361663
博客等级 码龄5年 0粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值