Java基础_22线程死锁,object类下面线程方法,生产者消费者

news2024/10/7 10:24:22
周二的回顾
1.线程的概念
	是进程(应用程序软件)最小的基本单位
2.在Java中代码咋写线程
	1.继承Thread类
	2.实现Runnable接口
	3.实现Callable接口
3.Thread相关的方法
	
4.同步锁
	目的:   当多个线程操作同一个资源的时候,会发生数据不安全性!!!
	加锁目的:   保证只有一个线程在操作咱们的资源  卖票的!!!
	1.同步方法  synchronized
	2.同步代码块  
	3.lock

	

今天的内容

1.守护线程

2.线程的生命周期

3.死锁

4.关于Object类下面和线程有关的方法【重点】

5.生产者消费者【难点重点】

1.守护线程【非重点】

守护线程是用来守护其他线程的(其他线程不是守护)

每个线程可能也可能不会被标记为守护程序。(靠咱们的代码来处理)

开启线程,一般不是守护线程,除非咱们使用代码将他变成守护线程

被守护的线程一旦结束,守护线程就会挂掉。

守护线程依附于非守护线程。如果非守护线程消亡。那么守护没有执行完也要挂掉!!!

帝王制度。皇帝(被守护线程)死了,妻子(守护线程)要陪葬

package com.qf.a_demon;


class MyThread1 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
}
public class Demo1 {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyThread1(), "狗蛋");
      //setDaemon(boolean on)
        //将此线程标记为daemon线程或用户线程。 当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。
        //线程启动前必须调用此方法。
        thread.setDaemon(true);//设置为守护线程
        thread.start();
        System.out.println(Thread.currentThread().isDaemon());
        for (int i = 0; i < 100; i++) {
            System.out.println("主线程:" + i);
        }

    }
}

2.线程的生命周期

  • 新建状态:

    使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。

  • 就绪状态:

    当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。

  • 运行状态:

    如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

  • 阻塞状态:

    如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:

    • 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
    • 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
    • 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
  • 死亡状态:

    一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.死锁

开发中禁止使用死锁

面试会问:

​ 应用场景:并发场景,多线程。线程之间互不相让。

线程加锁的目的就是为了安全。但是物极必反。

死锁是一种状态,当两个线程互相持有对方的资源的时候,却又不主动释放对方的资源。会导致死锁。代码不会正常的执行。这两个线程就会僵持住。哪个线程都不能往下执行。

线程1 有锁1 线程1想要使用锁2

线程 2 有锁2 线程2想要使用锁1

开锁公司需要身份证。开锁公司给你说: 先出示身份证再开锁 你说: 先开锁,因为身份证在屋里面 所以僵持不下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(6条消息) 什么是线程死锁?如何避免死锁?_TanaStudy的博客-CSDN博客

线程1拿到了锁1对象
线程2拿到了锁2对象
等待锁2的释放...
等待锁1的释放...
package com.qf.c_sisuo;


class DeadLock implements Runnable {
    private boolean flag;//标记属性
    private Object obj1;//资源1
    private Object obj2;//资源2
    //有参构造方法


    public DeadLock(boolean flag, Object obj1, Object obj2) {
        this.flag = flag;
        this.obj1 = obj1;
        this.obj2 = obj2;
    }

    @Override
    public void run() {
        if (flag) {//flag为true的时候  让线程1进来执行if语句中代码
            synchronized (obj1) {//锁obj 1资源
                System.out.println(Thread.currentThread().getName() + "拿到了obj1对象");

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //线程1走到这个方法不走了,休眠了
                System.out.println("我的线程1想拿obj2这个资源");
                synchronized (obj2) {//如果obj2一直没有释放,是锁不住这个资源的!!!
                    System.out.println(Thread.currentThread().getName() + "拿到了obj2对象");

                }

            }
        }
        
        //线程1拿到了obj1对象
        //线程2拿到了obj2对象
        //我的线程1想拿obj2这个资源
        //线程1拿到了obj2对象
        //
        //Process finished with exit code 0
        if (!flag) {//flag为false的时候  让线程2进来执行if语句中代码
            synchronized (obj2) {//锁obj 1资源
                System.out.println(Thread.currentThread().getName() + "拿到了obj2对象");
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("我的线程2想拿obj1这个资源");
                synchronized (obj1) {//如果obj2一直没有释放,是锁不住这个资源的!!!
                    System.out.println(Thread.currentThread().getName() + "拿到了obj1对象");

                }
            }
        }
    }
}
public class Demo1 {
    public static void main(String[] args) {
        Object obj1 = new Object();
        Object obj2 = new Object();
        //第一个线程
        DeadLock deadLock1 = new DeadLock(true, obj1, obj2);
        new Thread(deadLock1, "线程1").start();
        //第二个线程
        DeadLock deadLock2 = new DeadLock(false, obj1, obj2);
        new Thread(deadLock2, "线程2").start();
    }
}

4.和线程相关的Object类方法

Object类的方法

public final void wait(long timeout)
             throws InterruptedException

导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,才能够唤醒当前等待线程!!!

总结:两个线程,其中一个线程 对象.wait()方法,那么这个线程就会阻塞。什么叫阻塞?这个线程暂时

不执行了。如何让这个线程继续往下执行呢?再开另外一个线程。对象.notify()去唤醒另外一个线程!!!


等待线程:0
等待线程:1
等待线程:2
等待线程:3
等待线程:4
等待线程:5
等待线程:6
等待线程:7
等待线程:8
等待线程:9  以上是等待线程

唤醒线程:0
唤醒线程:1
唤醒线程:2
唤醒线程:3
唤醒线程:4
唤醒线程:5
唤醒线程:6
唤醒线程:7
唤醒线程:8
唤醒线程:9
唤醒线程已经将等待线程唤醒  以上是唤醒线程   唤醒线程目的是唤醒等待线程


野猪:0
野猪:1
野猪:2
野猪:3
野猪:4
野猪:5
野猪:6
野猪:7
野猪:8
野猪:9  以上是等待线程

Process finished with exit code 0

把消费者看成等待线程!!! 把生产者看成唤醒线程!!!

消费一个黄焖鸡!!!


还未出餐:0
还未出餐:1
还未出餐:2
还未出餐:3
还未出餐:4
还未出餐:5
还未出餐:6
还未出餐:7
还未出餐:8
还未出餐:9     消费者   点外卖的哥们   等待线程



唤醒线程:0
唤醒线程:1
唤醒线程:2
唤醒线程:3
唤醒线程:4
唤醒线程:5
唤醒线程:6
唤醒线程:7
唤醒线程:8
唤醒线程:9
唤醒线程已经将等待线程唤醒     生产者   唤醒线程


已经出餐0
已经出餐1
已经出餐2
已经出餐3
已经出餐4
已经出餐5
已经出餐6
已经出餐7
已经出餐8
已经出餐9      消费者得到     等待线程中

Process finished with exit code 0

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结:

新建两个线程:
	一个是等待线程
		等待线程中代码从上往下执行,但是使用object.wait()方法以后,咱们当前的线程就等待了,阻塞了
		到wait之后代码暂时不会往下执行了,需要借助于另外一个线程进行唤醒。
	一个是唤醒线程
		唤醒线程使用object.notify方法去将 等待线程中的正在等待的线程进行唤醒,让等待线程继续往下执行
		
好比:  在大学谈了个女朋友。你给你女朋友打电话晚上去吃饭,你女朋友说你来接我吧,到楼底下等着我
你在楼底下等着,你就是等待线程。你女朋友就是唤醒线程。你女朋友要化妆。化两个小时。你就得站在楼底下等两个小时,等你女朋友化完妆以后,她来唤醒你,说 走吧。然后你和她一起开开心心的去吃
	咱们wait和notify方法 实现线程之间的通信问题。
	
	
	我点了一份宫保鸡丁  我得等待  就是等待线程
	商家做好以后,唤醒我  别等了哥们。做好了吃吧  商家就是唤醒线程
package com.qf.c_object;

//为啥要写Message这个类?
//wait需要对象.wait()   先有类然后再创建对象  message.wait()
class Message {
    private String message;//信息

    public Message(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}
//等待线程
class WaiterThread implements Runnable {
    private Message msg;//要使用msg对象    msg.wait()

    public WaiterThread(Message msg) {
        this.msg = msg;
    }
    //为啥写构造方法,WaiterThread和NotifierThread里面 保证是同一个message对象

    @Override
    public void run() {
        //等待线程中获取线程的名字
        String name = Thread.currentThread().getName();
        System.out.println( name + "等待唤醒的时间:" + System.currentTimeMillis());
       //wait等待唤醒的时间:1670381924163
        synchronized (msg) {
            try {
                msg.wait();//当前线程会等待 不会往下执行。
                //为啥要加synchronized,当调用wait方法的时候
                //会自动释放锁,然后msg对象放到对象的等待池中
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + "被唤醒的时间:" + System.currentTimeMillis());
            System.out.println(name + "线程"+ msg.getMessage());
        }
    }
}
//唤醒线程
class NotifierThread implements Runnable {
    private Message msg;//使用msg对象  msg.nitify() 去唤醒等待线程

    public NotifierThread(Message msg) {
        this.msg = msg;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(10000);//唤醒线程睡10秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String name =Thread.currentThread().getName();
        System.out.println(name + "开始唤醒等待线程");
        synchronized (msg) {
            msg.setMessage("我是修改之后的message对象");
            //msg.notify();//去唤醒等待线程让等待线程继续往下执行
            msg.notifyAll();//去唤醒所有的等待线程
        }
    }
}
public class Demo1 {
    public static void main(String[] args) {
        Message message = new Message("我是message对象");
        WaiterThread waiterThread = new WaiterThread(message);

        //如果有两个等到线程呢?
        NotifierThread notifierThread = new NotifierThread(message);
        new Thread(waiterThread, "wait").start();
        new Thread(waiterThread, "wait1").start();
        new Thread(notifierThread, "notify").start();
    }
}

package com.qf.d_waitnotify;


class Message {
    private String message;

    public Message(String message) {

        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
class WaitThread implements Runnable{
    private Message message;

    public WaitThread(Message message) {
        this.message = message;
    }

    @Override
    public void run() {

        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+ ":" + i);
        }

        //0x998.wait()
        synchronized (message) {
            try {
                message.wait();//线程等待
                //为啥要用!!!当调用wait方法的时候,会自动的释放这个锁
                //把资源 message 放到对象的等待池中。
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+ i);
        }
    }
}
class NotifyThread implements Runnable{
    private Message message;

    public NotifyThread(Message message) {
        this.message = message;
    }
    @Override
    public void run() {
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+ ":" + i);
        }
       //0x998.notify();
        synchronized (message) {
            message.setMessage("已经出餐");
            //message.notify();
            message.notifyAll();
        }
        System.out.println("唤醒线程已经将等待线程唤醒");
    }
}
public class Demo1 {
    public static void main(String[] args) {
        Message message = new Message("还未出餐");//0x998
        WaitThread waitThread = new WaitThread(message);
        NotifyThread notifyThread = new NotifyThread(message);
        new Thread(waitThread, "等待线程1").start();
        new Thread(waitThread, "等待线程2").start();
        new Thread(notifyThread, "唤醒线程").start();
    }
}

总结:

Object类
wait()
notify()
notifyAll()

5.join方法【开发不用】

为啥join方法放在wait方法之后,因为join方法的底层是wait()方法

作用:让主线程等待,一直等待他的子线程执行完以后,才执行主线程

控制线程执行的顺序的!!!

package com.qf.d_join;

class Mythread1 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.err.println(Thread.currentThread().getName() + ":" + i);
        }

    }
}
public class Demo1 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Mythread1());
        thread.start();
        thread.join();//主线程开始等待子线程执行完以后再执行主线程
        for (int i = 0; i < 1000; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }

    }
}

package com.qf.d_join;

class FatherThread implements Runnable {
    @Override
    public void run() {

        //在FatherThread线程中去启动SonThread这个线程
        Thread thread = new Thread(new SonThread());
        //SonThread  是在FatherThread线程启动的,那就意味着
        //SonThread是FatherThread的一个子线程
        thread.start();
        try {
            thread.join();//thread的父线程
            //让主线程(父线程)等待,等到子线程执行完以后再执行父线程
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < 1000; i++) {
            System.out.println("父亲线程:" + i);
        }


    }
}
class SonThread implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.err.println("儿子线程:"+ i);
        }
    }
}
public class Demo2 {
    public static void main(String[] args) {
        new Thread(new FatherThread()).start();
    }
}

面试题:

你如何控制两个线程的执行顺序。
1.sleep  让另外一个线程先执行。睡完以后再执行其他线程
2.join   使用join让子线程先执行完
3.线程池

6.生产者消费者模式

生活中案例:

​ 卖家:汽车厂商 生产者

​ 买家: 咱们班40位同学 消费者

​ 狗蛋想买一个BYD汉 ,电车定完车以后需要等。

​ 狗蛋告知汽车厂商我要买车。如果有,直接发货。如果没有呢? 狗蛋会进入到等待状态。等汽车厂商生产好以后,唤醒狗蛋的等待线程。然后狗蛋来买车。如果今天没有人买车。汽车厂商进入到等待状态。

如果有人买车,立马唤醒汽车厂商线程,让他赶紧造车

生产者: 汽车厂商

消费者: 梦圆

美团 饿了吗 等都是这种模式

梦圆(消费者)想吃饭?咋办?

去饭店,然后说老板(生产者)我要吃酸菜鱼。老板说好 你等着。梦圆就进入到等待wait状态!!

饭做好了,老板,唉 哥们 做好了吃饭(唤醒梦圆(消费者))。梦圆在吃饭的时候

饭店在干嘛没有人再来吃饭。饭店阻塞状态 等待,等再上人。

现在看第一个问题:
	为啥是消费者抢到这个执行权,等了10秒以后才执行消费这线程!!!我让消费者睡了10s
	因为goods  是false 肯定生产者线程先抢到这个执行权,为啥?因为消费者睡觉。
	但是没有执行生产者,为啥?因为生产者在wait 有车。一旦wait 等过了10s以后
	消费者线程睡醒了,之后先执行消费者
	
	true之后又唤醒了生产者,让生产者 去生产者
	

消费者购买了:五菱,价格为:76.0
生产者生产了:兰博基尼价格为:200.0
消费者购买了:兰博基尼,价格为:200.0
生产者生产了:玛莎拉蒂价格为:300.0
消费者购买了:玛莎拉蒂,价格为:300.0
生产者生产了:兰博基尼价格为:200.0
消费者购买了:兰博基尼,价格为:200.0
生产者生产了:玛莎拉蒂价格为:300.0
消费者购买了:玛莎拉蒂,价格为:300.0
生产者生产了:兰博基尼价格为:200.0
消费者购买了:兰博基尼,价格为:200.0
生产者生产了:玛莎拉蒂价格为:300.0

package com.qf.e_shenchanzhexiaofezhe;

//为啥要写这个类?是作为两个线程之间的桥梁的共享资源
class Goods {
    private String name;//商品的价格
    private double price;//商品的价格
    private boolean isProduct;//是否需要生产?
    //true需要生产  false  不需要生产

    public Goods(String name, double price, boolean isProduct) {
        this.name = name;
        this.price = price;
        this.isProduct = isProduct;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public boolean isProduct() {
        return isProduct;
    }

    public void setProduct(boolean product) {
        isProduct = product;
    }
}
//消费者线程
class Customer implements Runnable {
    private Goods goods;

    public Customer(Goods goods) {
        this.goods = goods;
    }

    @Override
    public void run() {
        //消费者消费
        try {
            Thread.sleep(10000);//这个可写可不写
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //生产者一直生产,消费者一直消费
        while(true) {
            synchronized (goods) {
                //一直消费。判断商品是否有无?
                true需要生产(没有商品)  :false  不需要生产(有商品)
                if (!goods.isProduct()) {
                    //有商品的情况: 直接购买,购买完以后没有商品了
                    System.out.println("消费者购买了:" + goods.getName()+ ",价格为:" + goods.getPrice());
                    //购买完以后商品没了,去修改标记flag  然后唤醒生产者
                    goods.setProduct(true);
                    //唤醒生产者生产
                    goods.notify();
                } else {
                    //没有商品的情况: 生产者需要生产,消费者在等待,生产者线程要执行的
                    try {
                        goods.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        }
    }

}
//生产者线程
class Productor implements Runnable {
    private Goods goods;

    public Productor(Goods goods) {
        this.goods = goods;
    }

    @Override
    public void run() {
        int count = 0;
        //生产者生产
        while (true) {//死循环
            synchronized (goods) {
               if (goods.isProduct()) {//true 需要生产
                  //造车,如果是奇数的话,造玛莎拉蒂 如果偶数造另外一种车 兰博基尼
                   if (count % 2 == 0) {//偶数
                       goods.setName("兰博基尼");
                       goods.setPrice(200);
                   } else {//奇数
                       goods.setName("玛莎拉蒂");
                       goods.setPrice(300);
                   }
                   //生产者一定要把flag属性设置false
                   goods.setProduct(false);//false 有车了就不需要生产了
                   System.out.println("生产者生产了:" +goods.getName() + "价格为:" + goods.getPrice());
                   count++;
                   //生产完以后,消费者消费。在生产的时候,消费者在干嘛?消费者在等待
                   //唤醒消费者
                   goods.notify();

               } else {//不需要生产车  生产者在等待
                   try {
                       goods.wait();
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
            }
        }
    }
}
public class Demo1 {
    public static void main(String[] args) {
        //fasle不需要生产
        Goods goods = new Goods("五菱", 76, false);
        //两个线程共享是一个资源
        Customer customer = new Customer(goods);
        Productor productor = new Productor(goods);
        new Thread(customer).start();
        new Thread(productor).start();

    }
}

步骤:
	1.goods类   共享资源  实体类
	2.建一个消费者 类   一定是线程类
			如果有商品就消费。
			如果没有商品就等待
	3.建一个生产者类   线程类
			如果有商品就等待
			如果没有商品就生产
	4.main
		开启这两个线程
	
	

otify();

           } else {//不需要生产车  生产者在等待
               try {
                   goods.wait();
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
        }
    }
}

}
public class Demo1 {
public static void main(String[] args) {
//fasle不需要生产
Goods goods = new Goods(“五菱”, 76, false);
//两个线程共享是一个资源
Customer customer = new Customer(goods);
Productor productor = new Productor(goods);
new Thread(customer).start();
new Thread(productor).start();

}

}


步骤:
1.goods类 共享资源 实体类
2.建一个消费者 类 一定是线程类
如果有商品就消费。
如果没有商品就等待
3.建一个生产者类 线程类
如果有商品就等待
如果没有商品就生产
4.main
开启这两个线程






























本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FAOBlue---脂肪酸β-氧化(FAO)活性荧光定量试剂

Funakoshi品牌的FAOBlue是一款可通过荧光成像将活细胞内脂肪酸β-氧化&#xff08;FAO&#xff09;活性可视化的试剂。只需将产品添加到培养基中&#xff0c;即可通过荧光观察定量脂肪酸β-氧化活性。 FAO&#xff08;脂肪酸β-氧化&#xff0c;Fatty acid beta-oxidation&…

LeetCode——965. 单值二叉树

题目- 力扣&#xff08;LeetCode&#xff09; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,null,1] 输出&a…

Java工程师常见面试题:Java基础(一)

1、JDK 和 JRE 有什么区别&#xff1f; JDK是Java开发工具包&#xff0c;它包含了JRE和开发工具&#xff08;如javac编译器和java程序运行工具等&#xff09;&#xff0c;主要用于Java程序的开发。而JRE是Java运行环境&#xff0c;它只包含了运行Java程序所必须的环境&#xf…

大创项目推荐 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

imx6ull构建根文件系统

在nfs目录下创建 rootfs 复制正点原子给的BusyBox解压。 进入MakeFile&#xff0c;加入如下 中文字符支持 打开文件 busybox-1.29.0/libbb/printable_string.c&#xff0c; 打开文件 busybox-1.29.0/libbb/unicode.c make menuconfig 不要选中 编译 完成后如下 这里我解压文…

【ARM】如何通过ARMDS的Map文件查看堆栈调用情况

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 通过ARMDS生成的Map文件&#xff0c;查看工程的堆栈使用情况。 2、 问题场景 在对于工程进行调试和测试的时候&#xff0c;工程师通常需要了解目前工程的堆栈使用情况&#xff0c;是否有函数或者变量占用了过多的堆…

基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于HMM隐马尔可夫模型的金融数据预测算法.程序实现HMM模型的训练&#xff0c;使用训练后的模型进行预测。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运…

新手小白花几个月勇敢裸辞转行网络安全

我是 25 岁转行学网络安全的。说实在&#xff0c;转行就是奔着挣钱去的。希望我的经历可以给想转行的朋友带来一点启发和借鉴。 先简单介绍下个人背景&#xff0c;三流大学毕业&#xff0c;物流专业&#xff0c;学习能力一般&#xff0c;没啥特别技能&#xff0c;反正就很普通…

智慧园区解决方案一站式资料大全:标准规范顶层设计指南、供应商整体解决方案及售前PPT、标准白皮书、全国前50智慧园区集成商方案等全套600份,一次性打包下载

关键词&#xff1a;智慧园区解决方案&#xff0c;智慧园区整体解决方案&#xff0c;智慧园区建设总体方案设计&#xff0c;智慧园区综合管理系统&#xff0c;智慧产业园区解决方案&#xff0c;智慧产业园区规划方案&#xff0c;智慧园区建设规划方案&#xff0c;智慧工业园区建…

java正则表达式教程

什么是正则表达式&#xff1a; 正则表达式是一种用来描述字符串模式的语法。在 Java 中&#xff0c;正则表达式通常是一个字符串&#xff0c;它由普通字符&#xff08;例如字母、数字、标点符号等&#xff09;和特殊字符&#xff08;称为元字符&#xff09;组成。这些特殊字符可…

单链表经典算法题分析

目录 一、链表的中间节点 1.1 题目 1.2 题解 1.3 收获 二、移除链表元素 2.1 题目 2.2 题解 2.3 收获 2.4递归详解 三、反转链表 3.1 题目 3.2 题解 3.3 解释 四、合并两个有序列表 4.1 题目 4.2 题解 4.3 递归详解 声明&#xff1a;本文所有题目均摘自leetco…

康耐视visionpro-CogCreateLinePerpendicularTool操作操作工具详细说明

CogCreateLinePerpendicularTool]功能说明&#xff1a; 创建点到线的垂线 CogCreateLinePerpendicularTool操作说明&#xff1a; ①.打开工具栏&#xff0c;双击或点击扇标拖拽添加CogCreateLinePerpendicularTool ②.添加输入源&#xff1a;右键“链接到”或以连线拖 拽的方式…

如何使用上位机监控和控制设备

本文将介绍如何使用上位机来监控和控制设备&#xff0c;并探讨其中的关键步骤和注意事项。 1. 设备接口与通信设置 在使用上位机监控和控制设备之前&#xff0c;首先需要建立设备与上位机之间的通信连接。这通常涉及选择合适的通信接口和协议&#xff0c;例如串口、以太网、M…

OpenHarmony实战开发-如何使用ArkUIstack 组件实现多层级轮播图。

介绍 本示例介绍使用ArkUIstack 组件实现多层级轮播图。该场景多用于购物、资讯类应用。 效果图预览 使用说明 1.加载完成后显示轮播图可以左右滑动。 实现思路 1.通过stack和offsetx实现多层级堆叠。 Stack() {LazyForEach(this.swiperDataSource, (item: SwiperData, i…

算法思想总结:链表

一、链表的常见技巧总结 二、两数相加 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {//利用t来存进位信息int t0;ListNode*newheadnew ListNode(0);//创建一个哨兵节点&#xff0c;方便尾插List…

【从零开始手搓12306项目】十二、项目初始化配置

idea的编码环境全都改成UTF-8 自动导入依赖 自动编译

【C语言】每日一题,快速提升(3)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;杨辉三角 在屏幕上打印杨辉三角。 1 1 1 1 2 1 1 3 3 1 ……......... 解答&#xff1a; 按照题设的场景&#xff0c;能发现数字规律为&#xff1…

政安晨:【深度学习神经网络基础】(十)—— 反向传播网络中计算输出节点增量与计算剩余节点增量

目录 简述 二次误差函数 交叉熵误差函数 计算剩余节点增量 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xf…

Fatal error in launcher: Unable to create process using【解决方案】

拷贝python 项目到其他电脑以后&#xff0c;执行pip list 命令时报如下错误&#xff1a; Fatal error in launcher: Unable to create process using ‘“d:\python37\python.exe” “C:\Python\Scripts\pip.exe” list’: ??? 解决方法&#xff1a; 先试这条&#xff1a; …

Adobe将Sora、Runway、Pika,集成在PR中

4月15日晚&#xff0c;全球多媒体巨头Adobe在官网宣布&#xff0c;将OpenAI的Sora、Pika 、Runway等著名第三方文生视频模型&#xff0c;集成在视频剪辑软件Premiere Pro中&#xff08;简称“PR”&#xff09;。 同时&#xff0c;Adob也会将自身研发的Firefly系列模型包括视频…