多线程基础 [线程五大状态、死锁、线程同步、线程协作]

车底盘:阿克曼转向和四轮差速 特性四轮差速四轮转向阿克曼转向转向方式控制左右轮组速度差控制四个轮子的角度控制前轮角度(后轮固定)运动原理滑移摩擦(搓着走)纯滚动(滚着走)近乎纯滚动(低速时)能耗高低(实现纯滚动时)中轮胎磨损非常严重小中灵活性高(可原地旋转)极高(可全向移动)低(转弯半径大)控制精度较低(受地面摩擦影响大)极高高机械复杂度低(通常只需2个驱动电机)极高(需4个转向+4个驱动执行器)中(需1个转向+2个驱动执行器)典型应用坦克、履带车辆、简单AGV、扫地机器人豪华轿车、高性能全向AGV。 阅读详情

多线程

线程,进程,任务,多线程 ,程序??
程序:是指指令和数据的有序集合,其本身没有运行的含义,是一个静态的概念
进程:是指执行程序的一次执行过程,是一个动态的概念,是电脑分配资源的一个单位
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.线程

◆线程就是独立的执行路径;
◆在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程(main线程),gc线程(垃圾回收的进程);
◆main()称之为主线程,为系统的入口,用于执行整个程序; .
◆在一个进程中,如果开辟了多个线程7线程的运行由调度器安排调度,调度器是与
操作系统紧密相关的,先后顺序是不能人为的干预的。
◆对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;
◆线程会带来额外的开销,如cpu调度时间,并发控制开销。
◆每个线程在自己的工作内存交互,内存控制不当会造成数据不一致

2.线程的创建

Thread , Runnable ,Callable
在这里插入图片描述

2.1 Thread类

在这里插入图片描述在这里插入图片描述

自定义线程类继承Thread

//多线程的创建方式一 ,继承thread类并且重写run()方法
//注意线程开启,不一定先执行,只要看cpu调度谁先开始
public class ThreadTest extends Thread {
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码"+i);
        }
    }
    public static void main(String[] args) {
        //创建一个线程对象
        ThreadTest test = new ThreadTest();
        //执行start()方法,开启线程
        test.start();
        //主方法线程体
        for (int i = 0; i < 200; i++) {
            System.out.println("我在学习多线程"+i);
        }
    }
}

在这里插入图片描述使用多线程下载图片

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
/**
 * Created by MR.ZHANG on 2020/7/31 15:32
 */
//使用多线程下载图片
public class ThreadTest2 extends Thread{
    private String url;//网络图片的url
    private String name;//文件名字

    public ThreadTest2(String url,String name){
        this.url=url;
        this.name=name;
    }

    @Override
    //下载图片线程体
    public void run() {
        webDownLoad downLoad = new webDownLoad();
        downLoad.download(url,name);
        System.out.println("下载了图片");
    }
    public static void main(String[] args) {
        ThreadTest2 threadTest2 = new ThreadTest2("https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1596178880&di=bdd01c5e3da4d69f38286754154454cc&src=http://img.yzt-tools.com/20190708/7bbf9da8ff29079c6f3f8e9e47d17b0b.jpg?x-oss-process=image/resize,w_600/auto-orient,1/quality,q_90/format,jpg","1.jpg");
        ThreadTest2 threadTest1 = new ThreadTest2("https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1596178880&di=bdd01c5e3da4d69f38286754154454cc&src=http://img.yzt-tools.com/20190708/7bbf9da8ff29079c6f3f8e9e47d17b0b.jpg?x-oss-process=image/resize,w_600/auto-orient,1/quality,q_90/format,jpg","1.jpg");
        ThreadTest2 threadTest3 = new ThreadTest2("https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1596178880&di=bdd01c5e3da4d69f38286754154454cc&src=http://img.yzt-tools.com/20190708/7bbf9da8ff29079c6f3f8e9e47d17b0b.jpg?x-oss-process=image/resize,w_600/auto-orient,1/quality,q_90/format,jpg","1.jpg");

        threadTest1.start();
        threadTest2.start();
        threadTest3.start();
    }

}
//下载器类
class  webDownLoad {
    //下载方法
    public void download(String url,String name){
        try {
            //把网页地址变成一个文件
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("捕获到io异常,download方法出现问题");
        }
    }
}

在这里插入图片描述

2.2 实现Runnable接口

在这里插入图片描述

package Test;

/**
 * Created by MR.ZHANG on 2020/7/31 16:16
 */

//创建线程方式2,实现runnable接口 ,重写run方法 ,执行线程需要丢入runnable接口实现类,调用start方法
public class TestThread3  implements  Runnable{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码"+i);
        }
    }
    public static void main(String[] args) {
//        //创建runnable实例对象
//        TestThread3 testThread3 = new TestThread3();
//        //创建线程对象,并将runnable实例对象丢进去
//        Thread thread = new Thread(testThread3);
        new Thread(new TestThread3()).start();

        for (int i = 0; i < 200; i++) {
            System.out.println("我在学习多线程"+i);
        }
    }
}

在这里插入图片描述

多个线程操作一个对象

package Test;
/**
 * Created by MR.ZHANG on 2020/7/31 16:27
 */
//多个线程操作一个对象  模拟买票服务
//多个线程操作同一个资源,线程不安全会造成线程紊乱
public class ThreadTest4 implements Runnable{
    private int ticketNums =50;//票数
    @Override
    public void run() {
        while(true){
            if (ticketNums<=0){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums-- +"票" );
        }
    }
    public static void main(String[] args) {
        ThreadTest4 threadTest4 = new ThreadTest4();
        new Thread(threadTest4,"黄牛").start();
        new Thread(threadTest4,"手机app").start();
        new Thread(threadTest4,"电脑客户端").start();
    }
}

运行结果

在这里插入图片描述

模拟龟兔赛跑(案例)

package Test;
/**
 * Created by MR.ZHANG on 2020/7/31 16:42
 */
public class Race implements Runnable {
    private static String winner;//胜利者

    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
        //模拟兔子睡觉
         if (Thread.currentThread().getName().equals("兔子")&& i%10==0){
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //判断比赛是否结束
            Boolean flag = gameOver(i);
            if(flag){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"->跑了 "+i+"米");
        }
    }
    //判断比赛是否结束
    public Boolean gameOver(int step){
        //判断是否有胜利者
        if(winner!=null){
            return true;
        }else {
            if (step>=100){
                winner=Thread.currentThread().getName();
                System.out.println("winner  is  "+winner);
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        Race race = new Race();
        new Thread(race,"乌龟").start();
        new Thread(race,"兔子").start();
    }
}

结果
在这里插入图片描述

2.3 实现callable接口

在这里插入图片描述

package demo;
import Test.ThreadTest2;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.Callable;
/**
 * Created by MR.ZHANG on 2020/7/31 17:01
 */
//方式三,利用callable接口去实现多线程
public class CallableTest implements Callable<Boolean> {
    private String url;//网络图片的url
    private String name;//文件名字

    public CallableTest(String url,String name){
        this.url=url;
        this.name=name;
    }
    @Override
    public Boolean call() {
        webDownLoad downLoad = new webDownLoad();
        downLoad.download(url,name);
        System.out.println("下载了图片"+name);
        return true;
    }
   public static void main(String[] args) throws ExecutionException, InterruptedException {
        CallableTest callableTest = new CallableTest("https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1596178880&di=bdd01c5e3da4d69f38286754154454cc&src=http://img.yzt-tools.com/20190708/7bbf9da8ff29079c6f3f8e9e47d17b0b.jpg?x-oss-process=image/resize,w_600/auto-orient,1/quality,q_90/format,jpg", "1.jpg");
        CallableTest callableTest1 = new CallableTest("https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1596178880&di=bdd01c5e3da4d69f38286754154454cc&src=http://img.yzt-tools.com/20190708/7bbf9da8ff29079c6f3f8e9e47d17b0b.jpg?x-oss-process=image/resize,w_600/auto-orient,1/quality,q_90/format,jpg", "2.jpg");
        CallableTest callableTest2 = new CallableTest("https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1596178880&di=bdd01c5e3da4d69f38286754154454cc&src=http://img.yzt-tools.com/20190708/7bbf9da8ff29079c6f3f8e9e47d17b0b.jpg?x-oss-process=image/resize,w_600/auto-orient,1/quality,q_90/format,jpg", "3.jpg");

        //创建执行服务
        ExecutorService service = Executors.newFixedThreadPool(3);
        //提交执行
        Future<Boolean> r1 = service.submit(callableTest);
        Future<Boolean> r2 = service.submit(callableTest1);
        Future<Boolean> r3 = service.submit(callableTest2);
        //获取结果
        Boolean rs1 = r1.get();
        Boolean rs2 = r2.get();
        Boolean rs3 = r3.get();
        //关闭服务
        service.shutdownNow();
    }
}
class  webDownLoad {
    //下载方法
    public void download(String url,String name){
        try {
            //把网页地址变成一个文件
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("捕获到io异常,download方法出现问题");
        }
    }
}

在这里插入图片描述

3 .静态代理

第一步
要有一个共同的接口
第二步
代理角色和真实角色必须实现同一个接口,代理角色实现需要的功能
第三步
创建真实角色的对象和代理角色的对象,并将真实角色对象的引用传给代理角色,让代理角色去执行功能
在这里插入图片描述`

package demo;
/**
 * Created by MR.ZHANG on 2020/7/31 17:22
 */
//静态代理模式
public class StaticProxy {
    public static void main(String[] args) {
        WeddingCompany company = new WeddingCompany(new You());
        company.marry();
    }
}
class You implements Marry{
    @Override
    public void marry() {
        System.out.println("今天你结婚了,你非常开心");
    }
}
interface Marry{
    void marry();
}
class  WeddingCompany implements Marry{
    private Marry marry;
    public WeddingCompany(Marry marry) {
        this.marry = marry;
    }
    @Override
    public void marry() {
        before();
        this.marry.marry();
        after();
    }
    private void after() {
        System.out.println("结婚之后我们要去结算尾款");
    }
    private void before() {
        System.out.println("结婚之前准备婚礼等一系列事务");
    }
}

在这里插入图片描述这里我们并没有new 一个You的实例,而是让第三方去代理,我们把You的对象传递进去由三方帮助我们实现。

4.lamda表达式

在这里插入图片描述在这里插入图片描述在这里插入图片描述

package com.zy.lamda;

/**
 * Created by MR.ZHANG on 2020/7/31 17:46
 */

/**
 * 逐步推导lamda表达式
 */
public class TestLamda {

    public static void main(String[] args) {
        ILike like = new like();
        like.lamda();
         like = new like2();
        like.lamda();



        //第三种局部内部类
        class like3 implements ILike {
            @Override
            public void lamda() {
                System.out.println("i like lamda maybe3");
            }
        }

        like =new like3();
        like.lamda();
        //第四种匿名内部类 ,没有类的名称,只需要继承父类的接口
        like = new ILike() {
            @Override
            public void lamda() {

                System.out.println("i like lamda maybe4");
            }
        };
        like.lamda();
        //使用lamda表达式
        like= ()->{
            System.out.println(" i like lamda mybe5");
        };
        like.lamda();

    }
   //第二种定义在内部类的
  static class like2 implements ILike {
       @Override
       public void lamda() {
           System.out.println("i like lamda maybe2");
       }
   }


}

//定义一个函数式接口
interface ILike{
    void lamda();
}

//第一种实现类
class like implements ILike {
    @Override
    public void lamda() {
        System.out.println("i like lamda maybe");
    }
}


在这里插入图片描述总结:lamda表达式只有在执行语句是一条的时候才能简化成一条语句以及去掉 花括号
在这里插入图片描述

5.线程五大状态

在这里插入图片描述
在这里插入图片描述

5.1线程方法

在这里插入图片描述在这里插入图片描述

package demo;

/**
 * Created by MR.ZHANG on 2020/7/31 19:49
 */

//测试stop
    //建议线程自动停止--》利用次数,不建议死循环
    //建议使用标志位数=--》去设置一个标志位

public class TestStop  implements Runnable{

    //设置一个标识位
    private boolean flag=true;

    @Override
    public void run() {
        int i=0;
        while(flag){
            System.out.println("run ++++");
        }

    }
    //设置一个公开的stop方法,转换标志位
    public void stop(){
        this.flag=false;
    }
    public static void main(String[] args){

        TestStop stop = new TestStop();
        new Thread(stop).start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("main"+i);
            if (i==900){
                stop.stop();
                System.out.println("线程停止了");
            }
        }
    }
}

在这里插入图片描述

5.2线程休眠

在这里插入图片描述

package demo;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * Created by MR.ZHANG on 2020/7/31 20:06
 */
//模拟倒计时操作
public class TestSleep2 implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        
        Date startTime=new Date(System.currentTimeMillis());
        TestSleep2.tenDown();

        while(true){
            Thread.sleep(2000);
            System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
            startTime=new Date(System.currentTimeMillis());
        }
    }
    @Override
    public void run() {

    }
    public static void tenDown() throws InterruptedException {
        int num=10;
        while(true){
            Thread.sleep(1000);
            System.out.println(num--);
            if (num<=0){
                break;
            }
        }
    }
}

5.3线程礼让

在这里插入图片描述

package demo;

/**
 * Created by MR.ZHANG on 2020/7/31 22:12
 */


public class TestYield  {

    public static void main(String[] args) {
        MyYield myYield = new MyYield();

        new Thread(myYield,"a").start();
        new Thread(myYield,"b").start();

    }

}
class MyYield implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程开始启动");
        Thread.yield();//礼让
        System.out.println(Thread.currentThread().getName()+"线程结束");
    }
}

在这里插入图片描述

5.4 join

在这里插入图片描述

package demo;

/**
 * Created by MR.ZHANG on 2020/7/31 22:22
 */

//测试join方法 ,想象为插队
public class TestJoin implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("vip来了,想要插队");
        }

    }
    public static void main(String[] args) throws InterruptedException {

        //启动我们的线程
        TestJoin testJoin = new TestJoin();

        Thread thread = new Thread(testJoin);
        thread.start();

        for (int i = 0; i < 1000; i++) {
            if (i==200){
                thread.join();
            }
            System.out.println("main"+i);
        }

    }

}


在这里插入图片描述

5.5 线程状态观察

在这里插入图片描述

package demo;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

/**
 * Created by MR.ZHANG on 2020/7/31 22:35
 */


public class TestStatus {

    public static void main(String[] args) {

        Thread thread = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("///////");
        });

        //观察状态
        Thread.State state=thread.getState();
        System.out.println(state);//NEW新生
        //观察启动后
        thread.start();
       state= thread.getState();
        System.out.println(state);//RUM

        while(state!= Thread.State.RUNNABLE){//只要线程不终止,就一直输出状态
            try {
                Thread.sleep(200);
                state=thread.getState();
                System.out.println(state);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}

在这里插入图片描述

5.6线程的优先级

在这里插入图片描述代码测试

package demo;

/**
 * Created by MR.ZHANG on 2020/8/1 14:11
 */


public class TestPriority {
    public static void main(String[] args) {
        //主线程的优先级是默认的无法改变的
        System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());

        MyPriority myPriority = new MyPriority();
        Thread thread = new Thread(myPriority);
        Thread thread1 = new Thread(myPriority);
        Thread thread2 = new Thread(myPriority);
        Thread thread3 = new Thread(myPriority);
        Thread thread4 = new Thread(myPriority);
        Thread thread5 = new Thread(myPriority);
        Thread thread6 = new Thread(myPriority);
        thread.start();
        thread1.start();
        //需要先默认设置优先级否则默认按优先级五来算
        thread2.setPriority(1);
        thread2.start();
        thread3.setPriority(2);
        thread3.start();
        thread4.setPriority(3);
        thread4.start();
        thread5.setPriority(4);
        thread5.start();
        thread6.setPriority(Thread.MAX_PRIORITY);
        thread6.start();
    }


}
class  MyPriority implements Runnable{

    @Override
    public void run() {

        System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());
    }
}

在这里插入图片描述
在这里插入图片描述

5.7守护线程

在这里插入图片描述`

package Test;

import com.sun.org.apache.xml.internal.utils.ThreadControllerWrapper;

/**
 * Created by MR.ZHANG on 2020/8/1 14:50
 */


public class TestDaemon {

    public static void main(String[] args) {
        God god = new God();
        You you = new You();

        Thread thread = new Thread(god);
        thread.setDaemon(true);//将用户线程设置成守护线程,如果不设置true默认false用户进程
            //开启守护进程
        thread.start();
        new Thread(you).start();



    }
}
//上帝进程
class God implements Runnable{
    @Override
    public void run() {
        while (true){
            System.out.println("上帝保护着你");
        }

    }
}
//你
class You implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 36500; i++) {
            System.out.println("你已经开心的活着第 "+i+"天");
        }
        System.out.println("====goodbye! world===");
    }
}

在这里插入图片描述

5.8线程的同步

多个线程操作同一个资源
并发:
同一个对象被多线程操作

在这里插入图片描述在这里插入图片描述线程安全:要靠队列加锁来实现
线程同步
在这里插入图片描述

5.9三个场景模拟线程不安全

模拟买票

package com.zy.synchorized;

import com.sun.xml.internal.bind.v2.model.annotation.RuntimeAnnotationReader;

/**
 * Created by MR.ZHANG on 2020/8/1 15:10
 */

//不安全买票
public class UnSafeBuyTicket {
    public static void main(String[] args) {
        BuyTicket ticket = new BuyTicket();
        Thread a = new Thread(ticket, "黄牛");
        Thread b = new Thread(ticket, "苦逼的我");
        Thread c = new Thread(ticket, "苦逼的你");
        Thread d = new Thread(ticket, "脚本");
        a.start();
        b.start();
        c.start();
        d.start();
    }

}

class BuyTicket implements Runnable {

    private int ticketNus =20;
    Boolean flag=true;
    @Override
    public void run() {

        while (flag){
            buyTicket();
        }
    }

    public void buyTicket()  {

        if (ticketNus<=0){
            flag=false;
            return;
        }
        //模拟延时
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //买票
        System.out.println(Thread.currentThread().getName()+"买到了第 "+ticketNus--);
    }
}

在这里插入图片描述模拟银行取款

package com.zy.synchorized;

/**
 * Created by MR.ZHANG on 2020/8/1 15:26
 */

//不安全的银行取钱操作
public class UnSafeBank {
    public static void main(String[] args){
        Account account = new Account(100, "购房基金");

        Bank you = new Bank(account, 50, "你");
        Bank youGirlFriend = new Bank(account, 100, "你女朋友");

        you.start();
        youGirlFriend.start();
    }

}

//账户
class Account{
    int money;//余额
    String name;//卡名
    public Account(int money,String name){
        this.money=money;
        this.name=name;
    }
}
//银行
class Bank extends Thread{
    Account account;
    int drawMoney;//取了多少钱
    int nowMoney;//现在手里钱

    public Bank(Account account,int drawMoney,String name){
        super(name);
        this.account=account;
        this.drawMoney=drawMoney;
    }

    @Override
    public void run() {
        //判断有没有钱
        if (account.money-drawMoney<0){
            System.out.println(Thread.currentThread().getName()+"钱不够,取不了");
            return;
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //卡内余额等于你的钱减去取出来的钱
        account.money=account.money-drawMoney;
        //手里的钱
        nowMoney=nowMoney+drawMoney;
        System.out.println(account.name+"银行的余额"+account.money);
        System.out.println(Thread.currentThread().getName()+"手里的钱"+nowMoney);
    }
}

在这里插入图片描述不安全集合测试

package com.zy.synchorized;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by MR.ZHANG on 2020/8/1 15:46
 */
public class UnsSafeList {
    public static void main(String[] args) {
        List arrayList= new ArrayList<String>();
        for (int i = 0; i < 10000; i++) {
            new Thread(()->{
               arrayList.add(Thread.currentThread().getName());
            }).start();
        }
        System.out.println(arrayList.size());
    }//运行结果应该是10000可是这里并不是一万![在这里插入图片描述](https://img-blog.csdnimg.cn/20200801160009934.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvZGluZ2xvdmVyNQ==,size_16,color_FFFFFF,t_70)

}

在这里插入图片描述

5.10 线程安全

在这里插入图片描述同步代码块
在这里插入图片描述sychronized关键字
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
public void run() {
        //锁的对象是曾删改的对象
        synchronized (account){
            //判断有没有钱
            if (account.money-drawMoney<0){
                System.out.println(Thread.currentThread().getName()+"钱不够,取不了");
                return;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //卡内余额等于你的钱减去取出来的钱
            account.money=account.money-drawMoney;
            //手里的钱
            nowMoney=nowMoney+drawMoney;
            System.out.println(account.name+"银行的余额"+account.money);
            System.out.println(Thread.currentThread().getName()+"手里的钱"+nowMoney);

        }
  1. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
 public synchronized void buyTicket()  {
        if (ticketNus<=0){
            flag=false;
            return;
        }
        //模拟延时
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //买票
        System.out.println(Thread.currentThread().getName()+"买到了第 "+ticketNus--);
    }
  1. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
/**
* 同步线程
*/
class SyncThread implements Runnable {
        private static int count;

        public SyncThread() {
            count = 0;
        }

        public synchronized static void method() {
            for (int i = 0; i < 5; i ++) {
                try {
                    System.out.println(Thread.currentThread().getName() + ":" + (count++));
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        public synchronized void run() {
            method();
        }
}
  1. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

JUC安全类测试

package com.zy.synchorized;

import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;

/**
 * Created by MR.ZHANG on 2020/8/1 16:40
 */


public class TestJUC {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list =new CopyOnWriteArrayList();
        for (int i = 0; i < 10000; i++) {
            new Thread(()->{
                list.add(Thread.currentThread().getName());
            }).start();
        }
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(list.size());
    }
}

6 死锁

在这里插入图片描述在这里插入图片描述

package com.zy.Lock;

/**
 * Created by MR.ZHANG on 2020/8/1 16:49
 */

//死锁:两个线程互相持有对方需要的资源,然后形成僵持,
public class DeadLock {
    public static void main(String[] args) {
        MakeUp up = new MakeUp(0, "白雪公主");
        MakeUp up1 = new MakeUp(1, "灰姑凉");
        up.start();
        up1.start();
    }
}
//口红类
class LipStick{

}
//镜子类
class Mirror{

}
class MakeUp extends Thread{

    //一份资源用static,来表示这些资源只有一分
    static LipStick lipStick=new LipStick();
    static Mirror mirror=new Mirror();

    int choice;//悬着
    String girlName;//选择化妆品的人

    MakeUp(int choice,String girlName){
        this.choice=choice;
        this.girlName=girlName;
    }
    @Override
    public void run() {
        try {
            makeUp();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public void makeUp() throws InterruptedException {

        if(choice==0){
            synchronized (lipStick){
                System.out.println(girlName+"拿到了口红锁");
            }
            Thread.sleep(1000);
            synchronized (mirror){
                System.out.println(girlName+"拿到了镜子的锁");
            }
        }else{
            synchronized (mirror){
                System.out.println(girlName+"拿到了镜子锁");
            }
            Thread.sleep(2000);
            synchronized (lipStick){
                System.out.println(girlName+"拿到了口红的锁");
            }
        }


        }

}

6.1lock锁

在这里插入图片描述
常用的是ReentrantLock 可重用锁

package com.zy.Lock;

import com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl;

import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by MR.ZHANG on 2020/8/1 17:10
 */


public class TestLock {
    public static void main(String[] args) {
        TestLock2 lock2 = new TestLock2();
        Thread t1 = new Thread(lock2,"A");
        Thread t2 = new Thread(lock2,"B");
        Thread t3 = new Thread(lock2,"C");
        t1.start();
        t2.start();
        t3.start();
    }

}
class TestLock2 implements Runnable{
    private ReentrantLock lock =new ReentrantLock();
    private int ticketNums=20;
    @Override
    public void run() {
        try {
            lock.lock();//加锁
            while (true){
                if (ticketNums>0){
                    System.out.println(Thread.currentThread().getName()+"--"+ticketNums--);
                }else {
                    break;
                }

            }
        }finally {
            lock.unlock();
        }

    }
}

在这里插入图片描述在这里插入图片描述

7.线程协作

生产者消费者模式
线程通信
在这里插入图片描述在这里插入图片描述在这里插入图片描述

解决方式一 管程法

在这里插入图片描述

package com.zy.Lock;

/**
 * Created by MR.ZHANG on 2020/8/1 17:51
 */

//测试:生产者消费者模型,利用缓冲区解决:管程法

    //生产者,消费者,产品,缓冲区
public class TestPc {
    public static void main(String[] args) {
        SysContainer container = new SysContainer();
        new Provider(container).start();
        new Customer(container).start();
    }

}
//生产者
class Provider extends Thread{
    SysContainer container;
    public Provider(SysContainer container){
        this.container=container;
    }
//生产
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            container.push(new Chicken(i));
            System.out.println("第"+i+"只鸡");

        }
    }
}
//消费者
class Customer extends Thread{
    SysContainer container;
    public Customer(SysContainer container){
        this.container=container;
    }
//消费
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {

            System.out.println("消费了" +container.pop().id+"只鸡");
        }
    }
}
//产品
class Chicken{
    int id;

    public Chicken(int id) {
        this.id = id;
    }
}
class SysContainer{
    //需要一个容器大小

    Chicken[] chickens=new Chicken[10];
    //容器计数器
    int count = 0;
    //生产着放入产品
    public synchronized void push(Chicken chicken){
        if(count==chickens.length){
            //通知消费者消费,生产者等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //如果没有满,我们就需要丢入产品
        chickens[count] =chicken;
        count++;
        //可以通知消费者消费
        this.notifyAll();
    }

    //消费者消费产品
    public synchronized Chicken pop(){
        //判断内否消费
        if(count==0){
            //等待生产者生产,消费者等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //如果可以消费
        count--;
        Chicken chicken = chickens[count];
        //吃完了通知生产者生产
        this.notifyAll();
        return chicken;
    }

}

在这里插入图片描述

解决方式二 信号灯法

在这里插入图片描述

package com.zy.PC;
/**
 * Created by MR.ZHANG on 2020/8/1 19:38
 */
//测试生产者消费问题;信号灯法,标志位解决
public class TestPC2 {
    public static void main(String[] args) {

        TV tv = new TV();
        new Player(tv).start();
        new Watcher(tv).start();
    }

}
//演员
class Player extends  Thread{
    TV tv;
    public Player(TV tv){
        this.tv=tv;
    }
    @Override
    public void run() {

        for (int i = 0; i < 20; i++) {
            if(i%2==0){
                this.tv.play("快乐大本营");
            }else{
                this.tv.play("天天向上");
            }
        }
    }
}
//观众
class Watcher extends Thread{
    TV tv;
    public Watcher(TV tv){
        this.tv=tv;
    }
    @Override
    public void run() {

        for (int i=0;i<20;i++){
            tv.watch();
        }
    }
}
//产品  ,节目

class TV{
    String voice;//表演的节目
    //演员表演节目观众等待  T
    //观众观看时,演员等待   F
    Boolean flag=true;
    //表演
public synchronized void play(String voice){
    if (!flag){
        try {
            this.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    System.out.println("演员表演了"+voice);
    //通知观众观看
    this.notifyAll();//通知唤醒
    this.voice=voice;
    this.flag=!this.flag;
}
    //观看
    public synchronized  void watch(){
    if (flag){
        try {
            this.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
        System.out.println("观看完了"+voice);
    //通知演员继续表演
        this.notifyAll();
        this.flag=!this.flag;
    }
}

在这里插入图片描述

8 线程池

在这里插入图片描述在这里插入图片描述

package com.zy.PC;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by MR.ZHANG on 2020/8/1 19:58
 */

//测试线程池
public class TestPool {
    public static void main(String[] args) {
        //1. 创建服务,创建线程池
        ExecutorService service = Executors.newFixedThreadPool(10);
        service.execute(new MyThread());
        service.execute(new MyThread());
        service.execute(new MyThread());
        service.execute(new MyThread());
        //2.关闭连接
		service.shutdown();
    }
}
class MyThread implements Runnable{
    @Override
    public void run() {
            System.out.println(Thread.currentThread().getName());

    }
}

在这里插入图片描述

骑砍2霸主MOD开发(9)-游戏大地图(MapScene) Settlement类型由town,castle,castle_village,village,hideout五种类型组成,通过对GameEntity中添加tag实现类型的加载.大地图中军团(MobileParty)的移动速度,AI寻路,食物消耗等均和当前MobileParty所处地形有关,地形统一被定义为TerrainType,类型有森林,荒漠等.MapScene.Read("Main_map", ref sceneInitializationData, "") 装载Main_map大地图。 阅读详情

相关推荐

FreeSWITCH安装指南:三种部署方式解析与实践对比

Freeswitch部署方案比较:Yum安装简单快捷但灵活性差;源码安装可定制性强,适合深度开发和性能优化;Docker部署环境一致性好但网络配置复杂。生产环境推荐源码安装以获得最佳性能和定制能力,而Docker适合快速部署和扩展。不同方案各有利弊,需根据具体需求选择。

c_zyer的博客 2145

xml解析系列(二)——用Marshaller和Unmarshaller解析xml

常用标签 这是jdk1.6中自带的xml解析器,它可以通过配置的方式,将java对象和xml的节点映射起来,形成java对象和xml的方便的转换。 常用注解 @XmlRootElement  作用于类,表示该类与xml的主节点映射, 常用参数 name : 主节点标签名,默认与类名首字母小写一致。 @XmlElement 作用于属性的getset方法,表示该属性与节点对应,属性可以是L

咸鱼老罗的博客 9140

【AI平台】n8n入门2:第一个工作流,调用本地大模型

n8n是一款开源的,专注于AI工作流构建,支持灵活的自定义与集成。就是可以把大模型和其他工具联合起来,这就厉害了。而且,免费功能又强大,目前很火,来研究一下。

正经教主是个热衷于正经学习分享的教主。 4533

com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:241) 多线程

public class AppsImport {         private static final BranchService BRANCH_SERVICE = MinasServiceLocator.getBranchService();       private static final String        token          = TokenService.get

走马观花 3100

值得苦练的100道Python经典练手题(全网最全,附详细答案,建议收藏)

这100道Python练习题涵盖了从基础语法到高级算法、从数据库操作到Web开发的各个方面,是备考数据库系统工程师的绝佳素材。建议按照章节顺序逐一练习,遇到难点可反复钻研,真正掌握每一道题背后的知识点。通过这些练习,不仅能提升Python编程能力,还能加深对数据库系统原理的理解,为考试和实际工作打下坚实基础。

yue_yun_的博客 9396

LTE/NR中的相应cause场景【原创】

目录1.背景2.LTE EMM cause2.0 写在最前2.1 特殊处理的cause第一梯队第二梯队2.2 非特殊处理的cause3.NR cause 实网分析终端被拒等问题,经常遇到各类cause,其会对应不同的终端限制行为。查找已有资料后理解没有很深,自行总结本文用于梳理现象,如有错误敬请指正,转载请注明出处。 本文用于记录协议Ts 24.301及Ts 24.501中的cause及其对应行为。 已总结的cause值: 24.301中的cause分

2301_79567300的博客 3500

使用JAXB实现JAVA对象和XML字符串的互相转换实例

使用JAXB实现JAVA对象和XML字符串的互相转换实例,非常实用的技术。

动感超人的专栏 5万+

告别Modern Standby!Win10/11强制S3睡眠的终极指南(含BIOS设置避坑)

本文是针对Windows 10/11用户因Modern Standby(S0低电量待机)导致睡眠耗电、发热问题的终极解决方案。文章详细对比了Modern Standby与传统S3睡眠(Suspend to RAM)的本质区别,并提供了从系统诊断、注册表修改、BIOS/UEFI设置避坑到驱动优化的完整步骤,旨在帮助用户强制启用稳定、省电的S3睡眠模式,彻底告别睡眠噩梦。

n7o8p的博客 805

同步和死锁(三)

> 勿以恶小而为之,勿以善小而不为--------------------------刘备 > 劝诸君,多行善事积福报,莫作恶 主要内容: 同步和死锁

两个蝴蝶飞 692

英飞凌TC3xx DSADC旋变软解码实战:从示波器波形到VX1000数据,手把手教你避坑

本文详细介绍了英飞凌TC3xx系列微控制器的DSADC模块在电机旋变软解码中的实战应用。从示波器波形分析到VX1000数据采集,提供了一套完整的调试方法论,帮助工程师快速定位和解决常见问题,提升解码精度和系统性能。

weixin_30598225的博客 517

SAR动目标检测三剑客:DPCA/ATI/STAP技术选型指南(含2023最新实验数据对比)

本文深入对比了SAR动目标检测三大主流技术DPCA、ATI与STAP的核心原理与性能差异。基于2023年最新实验数据,分析了它们在最小可检测速度、测速精度、计算复杂度及对通道失配敏感度等方面的优劣,并结合海洋监视与城市交通监控等典型场景,提供了具体的技术选型指南与工程落地考量。

m5n6o7的博客 295

Java中线程的状态、同步锁以及死锁详解

线程的状态线程的六种状态 1.新建状态(new 线程对象) 2.运行状态(调用start方法) 3.受阻塞状态(等待CPU的执行资源) 4.休眠状态(调用了sleep(时间)方法) 5.等待状态(调用了wait方法) 6.死亡状态(run执行完毕)匿名内部类线程的第三种创建方式: 匿名内部类方式:相当于创建了一个该类的子类对象 new

Invincible_Y的博客 1028

【YOLO目标检测全栈实战】68 模型量化:从FP32到INT8,精度不掉,速度翻倍

摘要: 模型量化能显著提升推理速度(如YOLOv5s帧率从15FPS提升至38FPS),但需避免三大误区:1)校准集需覆盖实际场景,而非随机采样;2)敏感层(如检测头)应保留FP32精度;3)预处理必须与量化前后一致。通过混合精度量化(Backbone用INT8,检测头用FP32)和逐通道量化,可实现<1%的mAP损失。关键步骤包括校准数据准备、量化感知训练及逐层精度评估,最终在Jetson Nano等边缘设备上实现速度与精度的平衡。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 146

多线程基础详解

多线程基础 一、初识多线程 普通方法和多线程: 进程process和线程thread 创建线程的方式 通过继承Tread类 实战演示: package com.yan; /** * @author :Yan Guang * @date :Created in 2021/1/12 18:57 * @description: 单核cpu只能实现单线程,因为cpu执行速度很快, * 所以这里是视作为多线程,但是实际上还是交替执行的(由CPU调度实现),并不是一起执行的。 */ public

weixin_46558851的博客 300

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

3. Java 多线程基础课堂笔记

一、核心概念 1.线程是独立的执行路径,多线程就是指多条路径 2.线程一旦开启后是由操作系统的调度器安排调度的 3.创建线程: (1)

Dudu 229

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

Java 多线程

Java 多线程 多线程

THE CRAFTSMAN的博客 94

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

狂神说多线程笔记整理

狂神说多线程笔记整理

doris的博客 1万+

【JAVA】多线程基础

1.多线程基础 ⑴什么是多线程 运行中的exe程序就是一个进程,进程中独立的子任务就是线程 ⑵线程和进程的区别 进程是系统进行资源分配的一个独立单位,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,一个进程可以包括多个线程 ⑶线程的五大状态 新建 创建线程还没有start 就绪 start但是还没有获取CPU时间片 运行 正在执行 阻塞 比如sleep等...

屎蛋的铲屎官 3940

多线程 05:线程同步,三大不安全案例分析,synchronized 和 Lock 的应用,以及死锁相关知识

本文讲述线程同步相关知识,包括线程同步机制,线程同步涉及的三大不安全案例(不安全买票 / 取款 / 集合),及这些案例的完善方法。同时,通过 synchronized(同步)和 Lock(锁),我们能解决多线程共享资源引起的访问冲突,实现线程同步。此外,文章还介绍了死锁的知识,如死锁产生的条件,死锁的案例,以及如何避免死锁等。

积累,沉淀,温故而知新 1653

【Java多线程并发编程】面试知识点总结

文章目录概述继承Thread类实现Runnable接口实现Callable接口多线程买票案例 概述 面试中,多线程和并发编程已经是必不可少的了,我经常看到此类问题,当时也简单了解过,什么继承Thread类,实现Runnable接口,这些都被说烂了,知道这些当然是远远不够的,于是这几天搜索相关资料恶补了一下,为了方便后期复习,在此做个总结。 继承Thread类 这个可以说是很原始的方式,就是继承Th...

1万+

Java多线程(一文看懂!)

本章学习目录 问题的引出: 问题的解决: 页内目录 一,多线程的介绍 二,多线程的实现方式 三,多线程的五大状态 四,多线程的调度 五,线程的同步(多口售票问题) 六,线程的协作(生产者-消费者模型) 一,多线程的介绍 百度中多线程的介绍(multithreading):是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中

an_gentle_killer的博客 7416

Java多线程进阶

多线程进阶学习

weixin_53004298的博客 911

java多线程全面解析

多线程全面解析,线程池见下一篇

qq_54353206的博客 1215

Java线程状态,同步,锁学习

线程状态 五大状态 创建状态:Thread thread = new Thread(); 线程对象一旦创建就进入了新生状态。 就绪状态:当调用start()方法时,进入就绪状态,但不代表立即调度执行(等待cpu调度)。 运行状态:进入运行状态,线程才真正执行线程体的代码块。 阻塞状态:当调用sleep,wait或同步锁时,线程进入阻塞状态,就是代码不往下执行,阻塞解除后进入就绪状态,等待cpu调度。 死亡状态:线程中断或者结束,进入死亡状态,不能再次启动。 停止线程 停止线程:不推荐使用jdk的方法(已

qq_45332164的博客 437

多线程 详解(掌握这篇就够了)

文章目录一、线程简介Process和Thread程序 进程 线程核心概念二、线程创建(重点)1、继承Thread2、实现Runnable接口(推荐使用)3、 实现Callable接口4、龟兔赛跑5、小结继承Thread类实现Runnable接口静态代理Thread静态代理底层剖析动态代理newProxyInstance解析动态代理多个接口动态代理的秘密代理的作用总结lambda表达式三、线程状态(五大状态)状态概念线程方法停止线程(使用标志位)线程休眠(sleep)模拟网络延迟sleep获取当前时间线程礼让

qq_43377329的博客 6970

java里面的多线程

详细介绍 java里面多线程的基础知识点以及代码

m0_74304371的博客 944
上一篇: redis的发布订阅、主从复制、以及缓存穿透和雪崩
下一篇: spring的@Bean的生命周期
·小脑斧·
博客等级 码龄7年 10粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值