手撕多线程

用一个双线程轮流打印1-100

// 定义一个类,用于交替打印奇偶数
public class AlternatePrinting {// 当前待打印的数字,初始为1private int currentNumber = 1;// 用作线程间同步的锁对象private final Object lock = new Object();// 程序入口public static void main(String[] args) {// 创建类的实例AlternatePrinting ap = new AlternatePrinting();// 创建并启动打印奇数的线程Thread oddPrinter = new Thread(() -> ap.printNumbers(true));oddPrinter.start();// 创建并启动打印偶数的线程Thread evenPrinter = new Thread(() -> ap.printNumbers(false));evenPrinter.start();}// 根据传入的布尔值打印奇数或偶数private void printNumbers(boolean isOdd) {// 循环直到打印到100while (currentNumber <= 100) {// 同步块,确保线程安全synchronized (lock) {// 如果当前线程应该等待,则进入等待状态while ((isOdd && currentNumber % 2 == 0) || (!isOdd && currentNumber % 2 != 0)) {try {// 等待其他线程的通知lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 打印当前数字,并声明是哪个线程打印的(奇数还是偶数)if (currentNumber <= 100) {System.out.println("Thread " + (isOdd ? "Odd" : "Even") + " printed: " + currentNumber);// 数字递增,准备下一次打印currentNumber++;// 通知其他等待中的线程lock.notifyAll();}}}}
}

三个线程顺序打出1-100

// 定义一个类,用于交替打印数字,利用三个线程
public class AlternatePrintingThreeThreads {// 当前待打印的数字,初始为1private int currentNumber = 1;// 用作线程间同步的锁对象private final Object lock = new Object();// 用于指示当前轮到哪个线程打印private int turn = 0;// 程序入口public static void main(String[] args) {// 创建类的实例AlternatePrintingThreeThreads ap = new AlternatePrintingThreeThreads();// 创建三个线程,分别负责打印序列中的不同部分Thread printer1 = new Thread(() -> ap.printNumbers(0));Thread printer2 = new Thread(() -> ap.printNumbers(1));Thread printer3 = new Thread(() -> ap.printNumbers(2));// 启动线程printer1.start();printer2.start();printer3.start();}/*** 打印数字的方法,按线程的偏移量打印数字* @param offset 线程的偏移值,决定了它应该打印哪些数字*/private void printNumbers(int offset) {// 循环直到打印到100while (currentNumber <= 100) {// 同步块,确保线程安全synchronized (lock) {// 等待直到轮到当前线程打印while ((turn % 3) != offset) {try {// 等待其他线程的通知lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 打印当前数字,并声明是哪个线程打印的if (currentNumber <= 100) {System.out.println("Thread " + (offset + 1) + " printed: " + currentNumber);// 数字递增,准备下一次打印currentNumber++;// 轮转到下一个线程turn = (turn + 1) % 3;// 通知其他等待中的线程lock.notifyAll();}}}}
}

线程A,B,C分别打印数字1,2,3顺序执行10次

1  public class SequentialPrinting { 
2      
3      private int count = 0; // 用于控制当前执行的步骤
4      private final Object lock = new Object(); // 锁对象,用于同步控制
5      
6      public static void main(String[] args) { 
7          SequentialPrinting printer = new SequentialPrinting();
8          
9          // 创建三个不同的线程,分别负责打印"A", "B", "C"
10         Thread threadA = new Thread(() -> printer.printNumber(1, "A")); 
11         Thread threadB = new Thread(() -> printer.printNumber(2, "B")); 
12         Thread threadC = new Thread(() -> printer.printNumber(3, "C"));
13         
14         threadA.start(); // 启动线程A
15         threadB.start(); // 启动线程B
16         threadC.start(); // 启动线程C
17     } 
18     
19     private void printNumber(int numberToPrint, String letter) {
20         for (int i = 0; i < 10; i++) { // 每个线程打印10次
21             synchronized (lock) { // 进入同步块,确保线程安全
22                 while (count % 3 != numberToPrint - 1) { 
23                     try {
24                         lock.wait(); // 如果不是当前线程执行,则等待
25                     } catch (InterruptedException e) {
26                         e.printStackTrace();
27                     }
28                 }
29                 if (count < 30) { // 确保总共只打印30次
30                     System.out.println("Thread " + Thread.currentThread().getName() + " " + letter);
31                     count++; // 计数器增加,控制打印次数和顺序
32                     lock.notifyAll(); // 唤醒所有等待的线程
33                 }
34             } 
35         } 
36     } 
37 } 
38

计数累加怎么线程安全,可以怎么实现,100个线程,每个累加1000次。

1  import java.util.concurrent.ExecutorService;
2  import java.util.concurrent.Executors;
3  import java.util.concurrent.TimeUnit;
4  import java.util.concurrent.atomic.AtomicInteger;
5  
6  public class AtomicCounterDemo {
7      
8      private static final AtomicInteger counter = new AtomicInteger(0); // 使用原子类保证线程安全的计数器
9      
10     public static void main(String[] args) throws InterruptedException {
11         // 创建一个固定大小为100的线程池
12         ExecutorService executor = Executors.newFixedThreadPool(100); 
13         
14         // 提交100个任务到线程池,每个任务将计数器增加100次
15         for (int i = 0; i < 100; i++) {
16             executor.submit(new Runnable() {
17                 @Override
18                 public void run() {
19                     for (int j = 0; j < 100; j++) {
20                         counter.incrementAndGet(); // 安全地递增计数器
21                     }
22                 }
23             });
24         }
25         
26         // 关闭线程池,不接受新任务
27         executor.shutdown();
28         // 等待所有任务完成,最多等待1小时
29         executor.awaitTermination(1, TimeUnit.HOURS);
30         
31         // 输出最终的计数结果,预期为10000
32         System.out.println("Final count: " + counter.get());
33     }
34 }

线程交叉打印12A34B56C

1  public class CrossPrint {
2      private static final Object lock = new Object(); // 锁对象用于线程间的同步
3      private static boolean printNumber = true; // 控制打印流程的标志
4      
5      public static void main(String[] args) {
6          // 创建并启动打印数字的线程
7          Thread printNumberThread = new Thread(() -> {
8              for (int i = 1; i <= 52; i += 2) { // 循环打印从1到51的奇数
9                  synchronized (lock) {
10                     while (!printNumber) { // 如果当前不是打印数字的轮次,等待
11                         try {
12                             lock.wait();
13                         } catch (InterruptedException e) {
14                             e.printStackTrace();
15                         }
16                     }
17                     System.out.print(i); // 打印当前数字
18                     System.out.print(i + 1); // 打印下一个数字
19                     printNumber = false; // 设置标志为不打印数字
20                     lock.notifyAll(); // 唤醒等待的线程
21                 }
22             }
23         });
24         
25         // 创建并启动打印字母的线程
26         Thread printLetterThread = new Thread(() -> {
27             for (char c = 'A'; c <= 'Z'; c++) { // 循环打印从A到Z的字母
28                 synchronized (lock) {
29                     while (printNumber) { // 如果当前是打印数字的轮次,等待
30                         try {
31                             lock.wait();
32                         } catch (InterruptedException e) {
33                             e.printStackTrace();
34                         }
35                     }
36                     System.out.print(c); // 打印当前字母
37                     printNumber = true; // 设置标志为打印数字
38                     lock.notifyAll(); // 唤醒等待的线程
39                 }
40             }
41         });
42         
43         printNumberThread.start(); // 启动打印数字的线程
44         printLetterThread.start(); // 启动打印字母的线程
45     }
46 }

两个线程交替打印A- Z,一个大写一个小写。

1  public class AlternatePrinting {
2      private static final Object lock = new Object(); // 锁对象用于线程间同步
3      private static char currentLetter = 'A'; // 当前待打印的字母,初始为'A'
4      private static boolean printUpperCase = true; // 控制是否打印大写字母
5      
6      public static void main(String[] args) {
7          // 创建并启动打印大写字母的线程
8          Thread upperCasePrinter = new Thread(() -> printLetters(true));
9          // 创建并启动打印小写字母的线程
10         Thread lowerCasePrinter = new Thread(() -> printLetters(false));
11         
12         upperCasePrinter.start(); // 启动大写字母打印线程
13         lowerCasePrinter.start(); // 启动小写字母打印线程
14     }
15     
16     private static void printLetters(boolean isUpperCaseThread) {
17         while (currentLetter <= 'Z') { // 循环直到打印到'Z'
18             synchronized (lock) {
19                 while (printUpperCase != isUpperCaseThread) { // 等待直到符合当前线程的打印条件
20                     try {
21                         lock.wait(); // 等待其他线程的通知
22                     } catch (InterruptedException e) {
23                         e.printStackTrace(); // 打印中断异常
24                     }
25                 }
26                 // 根据线程类型打印对应的字母大小写
27                 if (isUpperCaseThread) {
28                     System.out.print((char) currentLetter); // 打印大写字母
29                 } else {
30                     System.out.print(Character.toLowerCase((char) currentLetter)); // 打印小写字母
31                 }
32                 
33                 // 切换打印模式,并移到下一个字母
34                 printUpperCase = !printUpperCase;
35                 currentLetter++;
36                 
37                 lock.notifyAll(); // 通知所有在等待锁的线程
38             }
39         }
40     }
41 }

打印a1b2...z26

1  public class AlternatePrinting {
2      private static final Object lock = new Object(); // 锁对象用于线程间同步
3      private static int count = 1; // 用于控制打印的数字和字母的序号
4      private static boolean printNumber = true; // 控制标志,true表示打印数字,false表示打印字母
5      
6      public static void main(String[] args) {
7          // 创建并启动打印数字的线程
8          Thread printNumberThread = new Thread(() -> {
9              while (count <= 26) { // 打印从1到26的数字
10                 synchronized (lock) {
11                     while (!printNumber) { // 如果当前轮到打印字母,线程等待
12                         try {
13                             lock.wait(); // 等待其他线程调用notifyAll() 
14                         } catch (InterruptedException e) {
15                             e.printStackTrace();
16                         }
17                     }
18                     if (count <= 26) {
19                         System.out.print(count); // 打印数字
20                         count++; // 数字增加
21                         printNumber = false; // 设置为打印字母
22                         lock.notifyAll(); // 通知所有等待的线程
23                     }
24                 }
25             }
26         });
27         
28         // 创建并启动打印字母的线程
29         Thread printLetterThread = new Thread(() -> {
30             while (count <= 26) { // 打印从A到Z的字母
31                 synchronized (lock) {
32                     while (printNumber) { // 如果当前轮到打印数字,线程等待
33                         try {
34                             lock.wait(); // 等待其他线程调用notifyAll()
35                         } catch (InterruptedException e) {
36                             e.printStackTrace();
37                         }
38                     }
39                     if (count <= 26) {
40                         char letter = (char) ('a' + count - 1); // 计算对应的字母
41                         System.out.print(letter); // 打印字母
42                         printNumber = true; // 设置为打印数字
43                         lock.notifyAll(); // 通知所有等待的线程
44                     }
45                 }
46             }
47         });
48         
49         // 启动两个线程
50         printNumberThread.start();
51         printLetterThread.start();
52     }
53 }

两个线程一个打abcd,一个打1234,交替打a1b2c3d4打10轮

1  public class AlternatePrintingDemo {
2      private static final Object lock = new Object(); // 锁对象用于线程间的同步
3      private static int state = 0; // 状态标志,0表示打印字母,1表示打印数字
4      private static int round = 0; // 轮次计数器,控制总共打印的轮次
5      
6      public static void main(String[] args) {
7          // 创建并启动打印字母的线程
8          Thread printLetters = new Thread(() -> {
9              for (int i = 0; i < 40; i++) { // 循环打印40个字符(总共打印20轮)
10                 synchronized (lock) {
11                     while (state != 0) { // 当状态不为0时,等待打印数字
12                         try {
13                             lock.wait(); // 等待数字打印线程通知
14                         } catch (InterruptedException e) {
15                             e.printStackTrace();
16                         }
17                     }
18                     if (round < 10) { // 仅当未达到10轮时执行打印
19                         char letter = (char)('a' + (i % 4)); // 计算当前字母
20                         System.out.print(letter); // 打印字母
21                         state = 1; // 更改状态为打印数字
22                         lock.notifyAll(); // 通知等待的数字打印线程
23                     }
24                 }
25             }
26         });
27         
28         // 创建并启动打印数字的线程
29         Thread printNumbers = new Thread(() -> {
30             for (int i = 0; i < 40; i++) { // 循环打印40个数字(总共打印20轮)
31                 synchronized (lock) {
32                     while (state != 1) { // 当状态不为1时,等待打印字母
33                         try {
34                             lock.wait(); // 等待字母打印线程通知
35                         } catch (InterruptedException e) {
36                             e.printStackTrace();
37                         }
38                     }
39                     if (round < 10) { // 仅当未达到10轮时执行打印
40                         int number = (i % 4) + 1; // 计算当前数字
41                         System.out.print(number); // 打印数字
42                         if ((i + 1) % 4 == 0) {
43                             round++; // 完成一轮后增加轮次计数
44                         }
45                         state = 0; // 更改状态为打印字母
46                         lock.notifyAll(); // 通知等待的字母打印线程
47                     }
48                 }
49             }
50         });
51         
52         // 启动两个线程
53         printLetters.start();
54         printNumbers.start();
55     }
56 }

 有T1,T2,T3三个线程,怎么保证,T2 在T1后面执行,T3在T2 后面执行

// 定义一个名为ThreadJoinDemo的类
public class ThreadJoinDemo {// 主方法,程序的入口点public static void main(String[] args) {// 创建三个线程t1、t2和t3,每个线程都绑定了一个特定的任务Thread t1 = new Thread(new Task("T1"), "T1");Thread t2 = new Thread(new Task("T2"), "T2");Thread t3 = new Thread(new Task("T3"), "T3");// 启动线程t1t1.start();try {// 主线程调用t1.join(),意味着主线程将在此等待,直到t1执行完毕t1.join();// t1完成后,启动线程t2t2.start();// 主线程调用t2.join(),意味着主线程将在此等待,直到t2执行完毕t2.join();// t2完成后,启动线程t3t3.start();// 主线程调用t3.join(),意味着主线程将在此等待,直到t3执行完毕t3.join();} catch (InterruptedException e) {// 如果线程在等待过程中被中断,打印异常堆栈e.printStackTrace();}// 所有线程执行完成后输出System.out.println("所有线程现在都完成");}
}// 定义Task类,实现Runnable接口
class Task implements Runnable {// 线程的名字private String name;// 构造函数,设定线程的名字public Task(String name) {this.name = name;}// 线程执行的内容@Overridepublic void run() {// 输出开始执行的信息System.out.println(name + " 开始执行");try {// 线程休眠一段随机时间,模拟执行任务Thread.sleep((long) (Math.random() * 1000));} catch (InterruptedException e) {// 如果休眠被中断,打印异常堆栈e.printStackTrace();}// 输出执行完成的信息System.out.println(name + " 执行完毕");}
}

500张票,44个窗口,模拟购票流程,

// 定义一个名为TicketSystemDemo的类,用于演示售票系统
public class TicketSystemDemo {// 定义总票数为500张private static final int TOTAL_TICKETS = 500;// 定义剩余票数,初始值等于总票数private static int remainingTickets = TOTAL_TICKETS;// 创建一个对象作为锁,用于同步线程private static final Object lock = new Object();// 主方法,程序入口public static void main(String[] args) {// 创建四个售票窗口的线程for (int i = 1; i <= 4; i++) {new Thread(new TicketWindow(i)).start();}}// 定义一个实现Runnable接口的TicketWindow类,代表售票窗口static class TicketWindow implements Runnable {// 窗口号private int windowNumber;// 构造函数,初始化窗口号public TicketWindow(int windowNumber) {this.windowNumber = windowNumber;}// 实现run方法,定义线程的执行行为@Overridepublic void run() {// 使用死循环使窗口持续运行while (true) {// 使用synchronized块确保线程安全synchronized (lock) {// 检查是否还有剩余票数if (remainingTickets > 0) {// 调用buyTicket方法进行售票buyTicket();} else {// 如果没有剩余票数,输出提示信息并退出循环System.out.println("票已售完,窗口" + windowNumber + "关闭。");break;}}// 线程随机休眠一段时间,模拟真实的售票操作try {Thread.sleep((long) (Math.random() * 1000));} catch (InterruptedException e) {// 捕获并打印中断异常e.printStackTrace();}}}// 定义一个私有的buyTicket方法,用于售票private void buyTicket() {// 每次售票,剩余票数减一remainingTickets--;// 输出售票信息System.out.println("窗口" + windowNumber + "售出1张票,剩余" + remainingTickets + "张票");}}
}

 

// 导入需要的库
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;// 定义一个名为TaskRunner的公共类
public class TaskRunner {// 定义一个静态方法,用于分批运行任务public static void runTasksInBatches(List<Runnable> tasks, List<List<Integer>> batches) {// 创建一个固定大小为10的线程池ExecutorService executor = Executors.newFixedThreadPool(10);// 用于存储每个批次任务的Future对象List<Future<Void>> futures = new ArrayList<>();// 存储所有批次的任务索引,用于确保任务不被重复提交Set<Integer> allBatchTaskIndexes = new HashSet<>();// 遍历所有批次for (int i = 0; i < batches.size(); i++) {// 遍历当前批次的每个任务索引for (int index : batches.get(i)) {// 提交任务到线程池,并添加返回的Future到列表中Future<Void> future = (Future<Void>) executor.submit(tasks.get(index));futures.add(future);// 记录已提交的任务索引allBatchTaskIndexes.add(index);}}// 等待所有任务完成for (Future<Void> f : futures) {f.get(); // 阻塞直到任务完成}// 清除所有的Future对象futures.clear();// 提交未包含在批次中的任务for (int i = 0; i < tasks.size(); i++) {if (!allBatchTaskIndexes.contains(i)) {executor.submit(tasks.get(i));}}// 关闭执行器服务,不再接受新任务executor.shutdown();// 等待直到所有任务完成while (!executor.isTerminated()) {// 循环等待直到所有线程执行完毕}// 输出任务全部完成的信息System.out.println("所有任务均已完成");}// 主方法public static void main(String[] args) {// 创建一百个任务List<Runnable> tasks = createTasks(); // 创建任务列表// 定义两个任务批次List<Integer> batch1 = new ArrayList<>(Arrays.asList(1, 3, 5, 7));List<Integer> batch2 = new ArrayList<>(Arrays.asList(11, 13, 15, 17));// 将批次添加到批次列表List<List<Integer>> batchs = new ArrayList<>();batchs.add(batch1);batchs.add(batch2);// 执行分批运行任务的方法try {runTasksInBatches(tasks, batchs);System.out.println("所有任务执行完毕");} catch (Exception e) {e.printStackTrace();}}// 创建任务的方法private static List<Runnable> createTasks() {List<Runnable> tasks = new ArrayList<>();for (int i = 0; i < 30; i++) {final int taskId = i;// 将新任务添加到列表,每个任务输出一个任务号tasks.add(() -> System.out.println("执行任务 #" + taskId));}return tasks; // 返回任务列表}
}

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

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

相关文章

企业做网站,如何设计才有创意?

企业做网站&#xff0c;如何设计才有创意&#xff1f;我们都希望能打造一个有创意的网站建设&#xff0c;能在众多网站中脱颖而出&#xff0c;能够营销推广公司的产品&#xff0c;为公司带来更多的经济效益收益。广州网站建设的时候&#xff0c;记住直观的设计可以让用户体验更…

福州网站建设如何设计极简风格合理?

福州网站建设如何设计极简风格合理&#xff1f;企业网站逐渐流行&#xff0c;每个人的审美也发生着巨大的改变&#xff0c;开始追求一种极简的风格。简单的 风格才能够凸显原有的主题&#xff0c;不会太过主次不分。 越来越多的网站建设中选择极简的风格&#xff0c;简单的页面…

在Leaflet中点对象使用SVG和Canvas两种模式的对比

目录 前言 一、关于SVG和Canvas 1、SVG知识 2、Canvas知识 3、优缺点 二、SVG和Canvas在Leaflet的使用 1、相关类图 2、Leaflet的默认展示方式 三、SVG和Canvas实例及性能对比 1、SVG模式及性能对比 2、Canvas优化 总结 前言 众所周知&#xff0c;在Leaflet当中&#…

Datasophon基于dinky1.0.1升级到dinky1.0.2

1.首先下载dinky1.0.2版本 dinky1.0.2下载地址 2.关闭dinky1.0.1 3.升级dinky1.0.2 3.1 解压dinky1.0.2.ta.gz tar -xzvf dinky-release-1.16-1.0.2.tar.gz -C /opt/datasophon/rm -rf dinky-release-1.16-1.0.2.tar.gz复制dinky1.0.1的配置文件到dinky1.0.2目录 cp /op…

Flutter笔记:Widgets Easier组件库(11)- 使用提示吐丝(Tip Toasts)

Flutter笔记 Widgets Easier组件库&#xff08;11&#xff09;使用提示吐丝 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

贪心,CF721 D. Maxim and Array

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 721D - Codeforces 二、解题报告 1、思路分析 如果我们当前乘积…

微信云小程序快速上手云数据库+云函数+云存储的操作

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…

Options API:选项式 API改成Composition API:组合式 API的留言板

让我欢喜让我忧 改成Composition API:组合式 API的代码&#xff0c; <template><!-- start --><span class"span_checkbox">操作<input type"checkbox" v-model"showInput" value"操作" /></span><…

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南

数字时代&#xff0c;人工智能&#xff08;AI&#xff09;及其相关技术正日益成为许多领域的热门话题。其中&#xff0c;生成式人工智能&#xff08;Gen AI&#xff09;和大型语言模型&#xff08;LLMs&#xff09;引起了广泛的兴趣和讨论。然而&#xff0c;尽管这些术语在科技…

哪些博客类型是最受欢迎的?

在创建博客时&#xff0c;您可能会想到的最常见的问题之一是哪些是最受欢迎的博客类型&#xff1f;有许多不同类型的博客涉及广泛的主题&#xff0c;兴趣和受众。对于一个成功的博客&#xff0c;你需要提前计划并选择适合你的利基市场。在本文中&#xff0c;我们将分享您可以立…

旋转矩阵(将坐标轴旋转)

旋转矩阵&#xff08;将坐标轴旋转&#xff09; 在二维空间中&#xff0c;旋转可以用一个单一的角 定义。作为约定&#xff0c;正角表示逆时针旋转。把笛卡尔坐标的列向量关于原点逆时针旋转的矩阵是&#xff1a; 原坐标系下 坐标系逆时针旋转β 补充 sin(-a) -sin(a) co…

Google Pixel4手机刷机+Root+逆向环境详细教程

Google Pixel4手机刷机Root逆向环境配置详细教程 刷机工具下载 Windows10、Google Pixel4手机当前安卓10系统、adb工具、要刷的谷歌原生的Android11最新刷机包、安装google usb驱动、美版临时twrp-3.6.0_11-0-flame.img和美版永久twrp-installer-3.6.0_11-0-flame.zip、Magis…

程序员有什么实用神器?

程序员的实用神器 在软件开发的海洋中&#xff0c;程序员的实用神器如同航海中的指南针&#xff0c;帮助他们导航、加速开发、优化代码质量&#xff0c;并最终抵达成功的彼岸。这些工具覆盖了从代码编写、版本控制到测试和部署的各个环节。 程序员常用的一些神器包括&#xf…

C语言(递归)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

数据结构——实现通讯录(附源码)

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

layui的treeTable组件,多层级上传按钮失效的问题解决

现象描述: layui的treeTable 的上传按钮在一层能用&#xff0c;展开后其他按钮正常点击&#xff0c;上传按钮无效。 具体原因没有深究&#xff0c;大概率是展开的子菜单没有被渲染treeTable的done管理到&#xff0c;导致没有重绘上传按钮。 解决方案: 不使用layu的上传组件方法…

C语言常见的动态内存错误及几个经典笔试题以及c/c++内存开辟空间等的介绍

文章目录 前言一、常见的动态内存错误1. 对NULL指针的解引用操作2. 对动态开辟空间的越界访问3. 对非动态开辟内存使用free()4. 使用free释放一块动态开辟内存的一部分5. 对同一块动态内存多次释放6. 动态开辟内存忘记释放&#xff08;内存泄漏&#xff09; 二、几个经典笔试题…

rust容器、迭代器

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;点击跳转 目录 一&#xff0c;std容器 1&#xff0c;Vec&#xff08;向量、栈&#xff09; 2&#xff0c;VecDeque&#xff08;队列、双端队…

邦注科技 模具保护器 CCD电子眼 专业工业视觉检测设备

模具保护器是一种用于保护模具的设备&#xff0c;可以在塑料压铸和冲床等加工过程中起到保护模具的作用。以下是关于模具保护器在保护塑料压铸和冲床模具方面的应用&#xff1a; 塑料压铸模具保护器&#xff1a; 防止碰撞&#xff1a;在塑料压铸过程中&#xff0c;模具可能会…

MindSponge分子动力学模拟——安装与使用

技术背景 昇思MindSpore是由华为主导的一个&#xff0c;面向全场景构建最佳昇腾匹配、支持多处理器架构的开放AI框架。MindSpore不仅仅是软件层面的工具&#xff0c;更重要的是可以协同华为自研的昇腾Ascend平台&#xff0c;做到软硬件一体的行业解决方案。基于MindSpore的高通…