【昕宝爸爸小模块】浅谈之创建线程的几种方式

在这里插入图片描述

➡️博客首页       https://blog.csdn.net/Java_Yangxiaoyuan


       欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。


       本文章CSDN首发,欢迎转载,要注明出处哦!


       先感谢优秀的你能认真的看完本文,有问题欢迎评论区交流,都会认真回复!


浅谈之创建线程的几种方式

  • 一、✅典型解析
    • 1.1✅Runnable和Callable区别
    • 1.2✅Future
    • 1.3✅FutureTask和Callable示例
  • 二、✅拓展知识仓
    • 2.1✅Runnable接口是什么
    • 2.2✅线程安全有哪些特性
    • 2.3✅什么是原子性
    • 2.4✅如何保证多线程同时操作数据不相互污染
    • 2.5✅Thread类有哪些构造函数
    • 2.6✅原子性和并行操作有什么关系
    • 2.7✅如何保证原子性操作不被干扰
    • 2.8✅线程安全和锁有啥区别
    • 2.9✅线程安全的优缺点是什么


一、✅典型解析


在Java中,共有四种方式可以创建线程,分别是:


  • 继承Thread类创建线程
  • 实现Runnable接门创建线程
  • 通过CallableFutureTask 创建线程
  • 通过线程池创建线程




    其实,归根结底最终就两种,一个是继承Thread类,一个是实现 Runnable接口 ,至于其他的。也是基于这两个方式实现的。但是有的时候面试官更关注的是实际写代码过程中,有几种方式可以实现所以一般说4种也没啥毛病。

1.1✅Runnable和Callable区别


Runnable接口Callable接口 都可以用来创建新线程,实现Runnable的时候,需要实现run方法;实现Callable接口的话,需要实现call方法


Runnable的run方法无返回值,Callable的call方法有返回值,类型为Object。


Callable中可以够抛出checked exception,而Runnable不可以。


CallableRunnable都可以应用于executors 。而 Thread类 只支持Runnable


1.2✅Future


Future是一个接口,代表了一个异步执行的结果。接口中的方法用来检查执行是否完成、等待完成和得到执行的结果。当执行完成后,只能通过get()方法得到结果,get方法会阻塞直到结果准备好了。如果想取消,那么调用cancel()方法


FutureTaskFuture接口的一个实现,它实现了一个可以提交给Executor执行的任务,并且可以用来检查任务的执行状态和获取任务的执行结果。


1.3✅FutureTask和Callable示例


import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;/**
* @author xinbaobaba
* FutureTask和Callable示例
*/
public class FutureAndCallableExample {public static void main(Stringl] args) throws InterruptedException, ExecutionException {Callable<String> callable = () -> {System.out.println("Entered Callable");Thread.sleep(2000);return "Hello from Callable";});FutureTask<String> futureTask = new FutureTask<>(callable);Thread thread = new Thread(futureTask);thread.start();System.out.println("Do something else while callable is getting executed");System.out.println("Retrieved: " + futureTask.get());}
}

二、✅拓展知识仓


2.1✅Runnable接口是什么


Runnable接口是Java中用于定义线程任务的接口。在Java中,可以通过实现Runnable接口来定义线程任务,实现Runnable接口的类必须实现run()方法,该方法定义了线程要执行的具体操作。通过创建Runnable对象并将其传递给Thread类的构造函数,可以创建一个新的线程,并启动该线程执行任务。


一个简单的示例:

/**
* @author xinbaobaba
* 使用Java实现Runnable接口来创建线程
*/public class MyRunnableTask implements Runnable {@Overridepublic void run() {// 线程执行的代码System.out.println("Hello from the thread!");}
}public class Main {public static void main(String[] args) {// 创建Runnable对象MyRunnableTask task = new MyRunnableTask();// 创建Thread对象,并传递Runnable对象作为参数Thread thread = new Thread(task);// 启动线程thread.start();}
}

代码解析:定义了一个名为MyRunnableTask的类,它实现了Runnable接口并重写了run()方法。在run()方法中,我们简单地打印了一条消息。然后,在main()方法中,我们创建了MyRunnableTask的实例,并使用该实例创建了一个新的线程对象。最后,我们调用start()方法启动了线程。当线程启动后,它将自动执行我们在run()方法中定义的代码。


2.2✅线程安全有哪些特性


线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。


线程安全的特性主要有以下几个方面


  1. 原子性:一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。原子性可以确保多个线程之间的操作不会相互干扰,从而保证数据的一致性。
  2. 可见性:一个线程对主内存的修改可以及时的被其他线程所观察到。可见性可以保证多个线程之间共享数据的实时更新,确保每个线程都能获取到最新的数据状态。
  3. 有序性:一个线程观察其他线程的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序。有序性可以保证代码的执行顺序按照程序员的预期进行,避免出现意外的结果。

以上就是线程安全的三大特性:原子性、可见性和有序性。这些特性可以确保多线程程序在并发执行时能够正确地处理共享数据,避免出现数据不一致、数据污染等问题

以下是一个简单的示例:



/**
* @author xinbaobaba
* 线程安全的基本特性ceshidemo
*/
public class ThreadSafeCounter {private int count = 0;public void increment() {count++;}public int getCount() {return count;}
}public class CounterThread extends Thread {private ThreadSafeCounter counter;public CounterThread(ThreadSafeCounter counter) {this.counter = counter;}@Overridepublic void run() {for (int i = 0; i < 1000; i++) {counter.increment();}}
}public class Main {public static void main(String[] args) {ThreadSafeCounter counter = new ThreadSafeCounter();CounterThread thread1 = new CounterThread(counter);CounterThread thread2 = new CounterThread(counter);thread1.start();thread2.start();try {thread1.join();thread2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Final count: " + counter.getCount());}
}

代码解析:定义了一个ThreadSafeCounter类,它有一个共享的count变量,用于计数。我们还定义了一个CounterThread类,它继承了Thread类,用于创建新的线程。每个线程都会执行1000次increment()操作,即增加计数。在main()方法中,我们创建了两个CounterThread线程,并启动它们。最后,我们等待两个线程执行完毕,并打印出最终的计数结果。


示例演示了线程安全的基本特性:原子性、可见性和有序性。由于increment()操作是原子的,即不会被其他线程打断,因此最终的计数结果是正确的。由于count变量的可见性得到了保证,每个线程都能观察到最新的计数结果。此外,由于线程调度和指令重排序的原因,最终的计数结果可能会与预期的顺序不同,但最终的结果仍然是正确的。


2.3✅什么是原子性


原子性是指在计算机科学中,一个操作(或一组操作)不可被中断地执行完毕或不执行,具有原子性的操作不会受到其他并发操作的干扰,能够保证数据的一致性和正确性。通俗来说,原子性就是“一气呵成”,不可分割的意思。原子性确保多个操作是一个不可以分割的整体,要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行。在数据库事务中,原子性是非常重要的特性之一,它可以确保事务中的所有操作都被完整地执行或者都不被执行,从而保持数据的一致性。


2.4✅如何保证多线程同时操作数据不相互污染


要保证多线程同时操作数据不相互污染,可以采用以下几种方法


1. 使用锁机制:可以使用Java中的synchronized关键字或者Lock对象来实现对共享数据的同步访问,确保一次只有一个线程能够访问共享数据,避免多个线程同时操作数据导致数据污染。


2. 使用读写锁:读写锁允许多个线程同时读取共享数据,但在写入数据时只允许一个线程访问,这样可以提高并发性能。


3. 使用volatile关键字:volatile关键字可以确保共享数据的可见性,当一个线程修改了共享数据后,其他线程可以立即看到修改后的数据。


4. 使用事务:数据库事务可以确保一系列操作要么全部成功,要么全部失败回滚,从而避免数据的不一致性。在Java中,可以使用JDBC或者ORM框架(如Hibernate)来管理数据库事务。


5. 使用线程安全的数据结构:Java提供了很多线程安全的数据结构,如Vector、Hashtable、CopyOnWriteArrayList等,这些数据结构内部已经实现了同步机制,可以保证多个线程同时访问时的正确性。


6. 避免共享状态:尽可能地减少共享状态,让每个线程都有自己的数据副本,这样可以避免多个线程之间的数据竞争和相互污染。


7. 使用消息队列:通过消息队列可以将多个线程之间的通信解耦,每个线程将需要操作的数据发送到队列中,另一个线程从队列中获取数据进行处理,这样可以避免直接访问共享数据。


为了保证多线程同时操作数据不相互污染,可以采用多种方法来保证数据的原子性、可见性和有序性。在具体实现时,需要根据实际情况选择适合的方法来保证数据的正确性和一致性


代码示例:


/**
* @author xinbaobaba
* 如何使用synchronized关键字来保证多线程同时操作数据不相互污染
*/
public class SharedData {private int count = 0;public synchronized void increment() {count++;}public synchronized int getCount() {return count;}
}public class ThreadA extends Thread {private final SharedData sharedData;public ThreadA(SharedData sharedData) {this.sharedData = sharedData;}@Overridepublic void run() {for (int i = 0; i < 1000; i++) {sharedData.increment();}}
}public class ThreadB extends Thread {private final SharedData sharedData;public ThreadB(SharedData sharedData) {this.sharedData = sharedData;}@Overridepublic void run() {for (int i = 0; i < 1000; i++) {System.out.println(sharedData.getCount());}}
}public class Main {public static void main(String[] args) {SharedData sharedData = new SharedData();ThreadA threadA = new ThreadA(sharedData);ThreadB threadB = new ThreadB(sharedData);threadA.start();threadB.start();try {threadA.join();threadB.join();} catch (InterruptedException e) {e.printStackTrace();}}
}

代码解析:定义了一个SharedData类,它有一个共享的count变量,用于计数。我们还定义了两个线程类ThreadAThreadB,它们分别执行增加计数和获取计数的操作。在SharedData类中,我们使用synchronized关键字对increment()getCount()方法进行了同步,确保一次只有一个线程能够访问共享数据。在main()方法中,我们创建了两个线程对象,并启动它们。由于使用了同步机制,即使两个线程同时访问共享数据,也不会出现数据污染的问题。最终的计数结果将正确地累加并输出。


2.5✅Thread类有哪些构造函数


在Java中,Thread类有几个构造函数,它们允许你创建和初始化线程。以下是Thread类的构造函数:


  1. Thread():这是一个默认构造函数,用于创建一个新的线程对象,但不会自动启动线程。
  2. Thread(Runnable target):这个构造函数接受一个实现了Runnable接口的对象作为参数,该对象定义了线程要执行的代码。
  3. Thread(ThreadGroup group, Runnable target):这个构造函数接受一个ThreadGroup对象和一个实现了Runnable接口的对象作为参数。ThreadGroup对象定义了线程所属的线程组。
  4. Thread(String name):这个构造函数接受一个字符串作为参数,用于为线程设置一个名称。
  5. Thread(ThreadGroup group, String name):这个构造函数接受一个ThreadGroup对象和一个字符串作为参数。ThreadGroup对象定义了线程所属的线程组,字符串用于为线程设置一个名称。
  6. Thread(Runnable target, String name):这个构造函数接受一个实现了Runnable接口的对象和一个字符串作为参数。字符串用于为线程设置一个名称,而Runnable对象定义了线程要执行的代码。
  7. Thread(ThreadGroup group, Runnable target, String name):这个构造函数接受一个ThreadGroup对象、一个实现了Runnable接口的对象和一个字符串作为参数。这些参数允许你设置线程的名称、定义线程要执行的代码以及设置线程所属的线程组。

注意:当你使用这些构造函数创建线程时,它们只是创建了线程对象,并不会自动启动线程。要启动线程,你需要调用线程对象的start()方法。


2.6✅原子性和并行操作有什么关系


原子性和并行操作是计算机科学中的两个重要概念,它们之间存在一定的关系。


原子性是指一个操作或者一组操作不可分割地执行,要么全部执行成功,要么全部执行失败。原子性主要应用于多线程编程和数据库事务管理中,用于保证多个线程或者事务中的操作的一致性和正确性。在多线程编程中,原子性可以避免多个线程同时访问共享数据时出现数据竞争和不一致的问题。在数据库事务管理中,原子性可以保证一系列操作要么全部成功,要么全部失败回滚,从而保持数据的一致性。


并行操作是指多个操作同时执行,以提高程序的执行效率。并行操作通常应用于多核处理器和分布式计算中,通过将多个任务分配给多个处理器或者计算机节点,同时执行这些任务,可以加快程序的执行速度。


原子性和并行操作之间存在一定的关系。在并行操作中,为了保持数据的一致性和正确性,需要确保每个操作都是原子的,即不可分割地执行。同时,原子性也可以帮助避免并行操作中可能出现的数据竞争和不一致问题。在实现并行操作时,可以通过加锁、事务管理等方式来保证操作的原子性,从而保证数据的一致性和正确性。


注意:原子性和并行操作之间存在一定的矛盾和权衡。过于强调原子性可能会影响并行操作的效率,而过于强调并行操作可能会增加数据竞争和不一致的风险。因此,在实际应用中,需要根据具体场景和需求来平衡原子性和并行操作的关系,以实现最佳的性能和正确性。


代码的示例:


/**
* @author xinbaobaba
* 原子性和并行操作之间的关系示例
*/
import java.util.concurrent.atomic.AtomicInteger;public class AtomicityAndParallelism {public static void main(String[] args) {AtomicInteger atomicCounter = new AtomicInteger(0);int numThreads = 10;Thread[] threads = new Thread[numThreads];// 创建并启动多个线程,每个线程递增计数器for (int i = 0; i < numThreads; i++) {threads[i] = new Thread(() -> {for (int j = 0; j < 1000; j++) {atomicCounter.incrementAndGet(); // 原子性操作}});threads[i].start();}// 等待所有线程执行完毕for (Thread thread : threads) {try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}}// 输出最终的计数器值,应该等于线程数量乘以每个线程的递增值System.out.println("Final counter value: " + atomicCounter.get());}
}

代码解析:使用了AtomicInteger类来创建一个原子性计数器。AtomicInteger类中的incrementAndGet()方法是一个原子性操作,它可以保证在多线程环境下对计数器的递增操作是原子的,即不可分割地执行。这样可以避免多个线程同时访问计数器时出现数据竞争和不一致的问题。


我们创建了10个线程,每个线程都执行1000次计数器的递增操作。通过使用原子性计数器,我们可以确保最终的计数器值是正确的,即等于线程数量乘以每个线程的递增值。如果没有原子性保证,可能会出现数据竞争和不一致的问题,导致最终的计数器值不正确。


示例说明了原子性和并行操作之间的关系。在并行操作中,原子性可以保证多个操作的一致性和正确性,避免数据竞争和不一致的问题。同时,通过并行操作可以提高程序的执行效率。在实际应用中,需要根据具体场景和需求来平衡原子性和并行操作的关系,以实现最佳的性能和正确性。


2.7✅如何保证原子性操作不被干扰


要保证原子性操作不被干扰,可以采用以下几种方法:


  1. 使用锁机制:Java中的synchronized关键字或者Lock接口可以用来控制对共享资源的访问,确保一次只有一个线程能够执行某个代码块或方法,从而防止其他线程的干扰。
  2. 使用并发容器:Java提供了很多并发容器,如ConcurrentHashMap、CopyOnWriteArrayList等,这些容器内部已经实现了线程安全,可以避免多线程环境下的数据不一致问题。
  3. 使用事务:在数据库操作中,可以使用事务来保证原子性。事务是一系列的操作,要么全部成功,要么全部失败回滚,这样可以避免数据的不一致。
  4. 使用乐观锁或悲观锁:在并发控制中,乐观锁和悲观锁也是常用的手段。乐观锁基于数据版本记录机制,通过版本号或时间戳等方式来控制并发操作时的数据一致性;悲观锁则是通过数据库的行级锁或表级锁来限制并发操作。
  5. 避免共享状态:尽可能地减少共享状态,每个线程处理自己的数据副本,不与其他线程共享数据。这样自然就不存在数据不一致的问题。
  6. 使用无锁数据结构:无锁数据结构(Lock-free data structures)是另一种解决方案,它使用原子操作来更新数据,而不需要显式的锁机制。
  7. 避免长时间持有锁:尽量减少持有锁的时间,以减少其他线程的等待时间,提高并发性能。
  8. 使用分布式系统解决方案:对于大规模的分布式系统,可以考虑使用分布式事务、两阶段提交、三阶段提交等解决方案来保证操作的原子性。

总之,要保证原子性操作不被干扰,需要结合具体的应用场景和需求,选择合适的并发控制策略和工具。


2.8✅线程安全和锁有啥区别


线程安全是多线程编程中使用的概念,用于保证多个线程之间数据的安全性和一致性。线程安全涉及到多个线程对共享数据的访问和修改,需要采取措施来避免数据竞争和不一致的问题。而锁是实现线程安全的一种机制,它可以控制对共享资源的访问,确保一次只有一个线程能够执行某个代码块或方法,从而防止其他线程的干扰。锁机制包括synchronized关键字、Lock接口、乐观锁和悲观锁等。因此,线程安全是一个更广泛的概念,而锁是实现线程安全的一种具体手段。


2.9✅线程安全的优缺点是什么


线程安全的优点主要包括:


  1. 保证数据完整性:线程安全可以保证多线程环境下的数据完整性和一致性,避免数据竞争和不一致的问题。
  2. 提高系统稳定性:线程安全有助于提高系统的稳定性和可靠性,减少因数据错误或不一致导致的问题。
  3. 充分利用多核资源:线程安全可以利用多核处理器的资源,通过并行计算提高程序的执行效率。

线程安全缺点


  1. 性能开销:线程安全的实现需要引入额外的机制来控制线程的访问和同步,这可能导致一定的性能开销。
  2. 编程难度增加:线程安全的实现需要更全面深入地考虑多线程的同步和协调问题,增加了编程的复杂度和难度。
  3. 死锁和活锁风险:线程安全需要合理地设计锁机制和控制线程的执行顺序,否则可能导致死锁或活锁的问题。
  4. 资源竞争:在多线程环境下,资源竞争可能导致线程阻塞或等待,影响程序的执行效率和响应性。

因此,在实现线程安全时需要权衡利弊,根据具体的应用场景和需求选择合适的线程安全策略,以实现最佳的性能和正确性。


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

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

相关文章

JVM实战(14)——Young GC调优

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

C++学习笔记——用C++实现树(区别于C)

树是一种非常重要的数据结构&#xff0c;它在计算机科学中的应用非常广泛。在本篇博客中&#xff0c;我们将介绍树的基本概念和C中如何实现树。 目录 一、树的基本概念 2.C中实现树 2.1创建一个树的实例&#xff0c;并向其添加节点 2.2三种遍历方式的实现代码 3.与C语言相…

B端产品经理学习-版本规划管理

首先我们回顾一下用户故事&#xff0c;用户故事有如下特点&#xff1a; PRD文档的特点则如下&#xff1a; B端产品中用户角色不同&#xff0c;需求侧重也不同 决策人——公司战略需求&#xff1a;转型升级、降本增效、品牌提升等 管理负责人——公司管理需求&#xff1a;提升…

翼龙-2H无人机

一、概述 翼龙-2&#xff0c;是成都飞机工业集团研制的无人驾驶飞行器&#xff0c;是空中侦察、精确打击和应急通讯的平台。成都飞机工业集团于2015年9月的北京国际航空航天展览会上介绍了翼龙-2的概念。在2016年珠海航展期间&#xff0c;翼龙-2的原型机首次向公众展示。 因为…

c#异形窗体遮罩效果

c#异形窗体遮罩效果&#xff0c;移动&#xff0c;关闭&#xff0c;最大化&#xff0c;最小化&#xff0c;还原操作 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D…

构建Python随机密码生成器:保障账户安全的简易工具

密码安全是当前数字时代的一个重要议题。在保护个人信息和账户安全方面&#xff0c;安全且可靠的密码是至关重要的。本文将带您逐步了解如何使用Python创建一个随机密码生成器&#xff0c;以生成高强度、难以猜测的密码。 导言 在网络环境中&#xff0c;密码是保护个人账户和…

Linux网络文件共享服务1(基于FTP文件传输协议)

目录 一、了解FTP 1、FTP的相关概念 2、FTP的两种模式及工作原理 2.1 主动模式 2.2 被动模式 3、vsftpd 软件介绍 3.1 基础操作 4、vsftpd服务常见配置 4.1 修改默认命令端口 4.2 主动模式端口 4.3 被动模式端口 4.4 使用当地时间 4.5 匿名用户登录 4.6 匿名用户上…

c语言-库函数strstr()、strtok()、strerror()介绍

文章目录 前言一、库函数strstr()1.1 strstr()介绍1.2 strstr()模拟实现 二、库函数strtok()2.1 strtok()介绍 三、库函数strerror()3.1 strerror()介绍 总结 前言 本篇文章介绍c语言库函数strstr()、strtok()、strerror()的使用。 一、库函数strstr() 1.1 strstr()介绍 str…

基于ssm的线上旅游体验系统+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

Hive导入数据的五种方法

在Hive中建表成功之后&#xff0c;就会在HDFS上创建一个与之对应的文件夹&#xff0c;且文件夹名字就是表名&#xff1b; 文件夹父路径是由参数hive.metastore.warehouse.dir控制&#xff0c;默认值是/user/hive/warehouse&#xff1b; 也可以在建表的时候使用location语句指定…

x-cmd pkg | duf - df 命令的现代化替代品

目录 简介用户首次快速实验指南技术特点竞品和相关作品进一步探索 简介 Duf &#xff08;Disk Usage/Free Utility&#xff09;是一个磁盘分析工具。其直观的输出和多样化的自定义选项&#xff0c;帮助用户更好地管理和优化存储资源。 用户首次快速实验指南 使用 x duf 即可自…

考研经验总结——目录

文章目录 一、写作顺序二、个人情况说明三、读评论四、一些小牢骚五、一些注意事项&#xff08;持续更新&#xff09; 一、写作顺序 我将准备从三个阶段开始介绍吧 考研前考研中考研后&#xff08;也就是现在我的这种情况&#xff09; 考研前我会分为&#xff1a;数学、专业…

spring Security源码分析-13种过滤器详解

13种核心过滤器 spring security的13个核心过滤器(按执行顺序陈列): WebAsyncManagerIntegrationFilterSecurityContextPersistenceFilterHeaderWriterFilterLogoutFilterUsernamePasswordAuthenticationFilterDefaultLoginPageGeneratingFilterDefaultLogoutPageGeneratingF…

java获取已经发送谷歌邮件的打开状态

1.前言 现在网上的方案都是在邮件里面插入一张图片的地址&#xff0c;当收件人打开之后&#xff0c;就会发送请求到指定路径的服务器上&#xff0c;然后在请求的controller里面处理邮件的状态&#xff0c;这个方案确实是行得通的&#xff0c;本文章只是给大家避个坑&#xff0…

HNU-模式识别-作业1-视频监控系统

模式识别-作业1 计科210X 甘晴void 202108010XXX 【评分&#xff1a;98/100】 题目&#xff1a; 查阅相关技术资料&#xff0c;根据自己家庭相应的情况&#xff0c;设计一个视频监控系统。要求&#xff1a; 系统功能说明系统布线图及说明系统软硬件配置说明 饱和式自家用…

C++ mapset

目录 相关知识介绍&#xff1a; 一、set 1、set的介绍 2、set的使用 1. set的模板参数列表 2. set的构造 3. set的迭代器 4. set的容量 5. set修改操作 6. 举例演示 二、multiset 1、multiset的介绍 2、multiset的使用 三、map 1、map的介绍 2、map的使用 1.…

基于Java SSM框架实现摄影器材租赁系统项目【项目源码+论文说明】

基于java的SSM框架实现摄影器材租赁系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

跨境电商账号频繁?你的IP可能“不干净”了

疫情促进了跨境电商行业的加速发展&#xff0c;许多卖家也抓住了这波流量红利&#xff0c;跨境电商月入数万&#xff0c;数十万甚至数百万的造福神话也不断在上演&#xff0c;但由于国内外电商运营模式不同&#xff0c;多店运营、用户数据收集、刷单等行为都受到了国外平台的严…

vue前端开发自学,异步加载组件,提升用户端的客户体验度

vue前端开发自学,异步加载组件,提升用户端的客户体验度&#xff01;现实项目开发时&#xff0c;组件的数量非常庞大&#xff0c;如果都是一口气加载完&#xff0c;对手机用户来说&#xff0c;体验度会很差。因此&#xff0c;非常有必要使用异步加载。 那就是&#xff0c;用到了…

【WEB API自动化测试】接口文档与在线测试

这一篇我们主要介绍如何做API帮助文档&#xff0c;给API的调用人员介绍各个 API的功能, 输入参数&#xff0c;输出参数, 以及在线测试 API功能(这个也是方便我们自己开发调试) 我们先来看看我们的API最终帮助文档及在线测试最终达到的效果: 概要图 GET API 添加产品API: 删除…