当前位置: 首页 > news >正文

基于springboot实现多线程抢锁的demo

1、本代码基于定时调度和异步执行同时处理,如果只加异步处理,会导致当前任务未执行完,下个任务到点也不会触发执行

    @Scheduled(fixedRate = 50_000)@Asyncpublic void testThread() throws Exception{ZkLock lock = new ZkLock(zkJob.getZK(), "/vman/analyse_job/lock2");try {if (!lock.acquire(20, TimeUnit.SECONDS)) {log.warn("有其他线程进行分析任务的数据迁移,暂停本次执行");return;}StringBuilder sb = new StringBuilder("处理成功的分析任务id:");Integer startShareId = 1;Integer endShareId   = 100;Integer count = 0;while (startShareId.compareTo(endShareId) <= 0) {try {Thread.sleep(1000);sb.append(startShareId).append(",");} catch (Exception e) {log.info("自助分析任务批量转换异常,jobId:{},exception:{}", startShareId, e);}startShareId++;if (count++ % 20 == 0) {log.info("当前分析任务id:{},转换成功的任务信息:{}", startShareId, sb.toString());sb = new StringBuilder("处理成功的分析任务id:");}}}catch(Exception e) {log.info("定时任务,分析任务转换异常:{}",e);}finally {log.info("关闭分析任务的锁");lock.release();}}

2、日志信息:

[2023-09-04 18:54:15.562] [INFO] [SimpleAsyncTaskExecutor-64] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:62,转换成功的任务信息:处理成功的分析任务id:42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,
[2023-09-04 18:54:23.082] [WARN] [SimpleAsyncTaskExecutor-65] [com.vip.vman.service.job.VmanConvertManager] >>> 有其他线程进行分析任务的数据迁移,暂停本次执行
[2023-09-04 18:54:23.083] [INFO] [SimpleAsyncTaskExecutor-65] [com.vip.vman.service.job.VmanConvertManager] >>> 关闭分析任务的锁
[2023-09-04 18:54:35.629] [INFO] [SimpleAsyncTaskExecutor-64] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:82,转换成功的任务信息:处理成功的分析任务id:62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,
[2023-09-04 18:54:41.870] [INFO] [client-forward-message-scheduler] [com.vip.daas.client.DaasSession$DaasClientEndpoint] >>> Send heart beat message to master [10.199.210.210:9002]
[2023-09-04 18:54:54.687] [INFO] [SimpleAsyncTaskExecutor-64] [com.vip.vman.service.job.VmanConvertManager] >>> 关闭分析任务的锁
[2023-09-04 18:54:54.687] [INFO] [SimpleAsyncTaskExecutor-64] [com.vip.vman.client.zk.ZkLock] >>> zkLock release -> /vman/analyse_job/2023090418/lock2
[2023-09-04 18:54:55.852] [INFO] [SimpleAsyncTaskExecutor-66] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:2,转换成功的任务信息:处理成功的分析任务id:1,
[2023-09-04 18:55:15.934] [INFO] [SimpleAsyncTaskExecutor-66] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:22,转换成功的任务信息:处理成功的分析任务id:2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
[2023-09-04 18:55:36.024] [INFO] [SimpleAsyncTaskExecutor-66] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:42,转换成功的任务信息:处理成功的分析任务id:22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,
[2023-09-04 18:55:41.866] [INFO] [client-forward-message-scheduler] [com.vip.daas.client.DaasSession$DaasClientEndpoint] >>> Send heart beat message to master [10.199.210.210:9002]
[2023-09-04 18:55:56.091] [INFO] [SimpleAsyncTaskExecutor-66] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:62,转换成功的任务信息:处理成功的分析任务id:42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,
[2023-09-04 18:56:03.061] [WARN] [SimpleAsyncTaskExecutor-67] [com.vip.vman.service.job.VmanConvertManager] >>> 有其他线程进行分析任务的数据迁移,暂停本次执行
[2023-09-04 18:56:03.061] [INFO] [SimpleAsyncTaskExecutor-67] [com.vip.vman.service.job.VmanConvertManager] >>> 关闭分析任务的锁
[2023-09-04 18:56:16.164] [INFO] [SimpleAsyncTaskExecutor-66] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:82,转换成功的任务信息:处理成功的分析任务id:62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,
[2023-09-04 18:56:35.223] [INFO] [SimpleAsyncTaskExecutor-66] [com.vip.vman.service.job.VmanConvertManager] >>> 关闭分析任务的锁
[2023-09-04 18:56:35.223] [INFO] [SimpleAsyncTaskExecutor-66] [com.vip.vman.client.zk.ZkLock] >>> zkLock release -> /vman/analyse_job/2023090418/lock2
[2023-09-04 18:56:36.359] [INFO] [SimpleAsyncTaskExecutor-68] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:2,转换成功的任务信息:处理成功的分析任务id:1,
[2023-09-04 18:56:41.876] [INFO] [client-forward-message-scheduler] [com.vip.daas.client.DaasSession$DaasClientEndpoint] >>> Send heart beat message to master [10.199.210.210:9002]
[2023-09-04 18:56:56.429] [INFO] [SimpleAsyncTaskExecutor-68] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:22,转换成功的任务信息:处理成功的分析任务id:2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
[2023-09-04 18:57:16.497] [INFO] [SimpleAsyncTaskExecutor-68] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:42,转换成功的任务信息:处理成功的分析任务id:22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,
[2023-09-04 18:57:36.600] [INFO] [SimpleAsyncTaskExecutor-68] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:62,转换成功的任务信息:处理成功的分析任务id:42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,
[2023-09-04 18:57:41.895] [INFO] [client-forward-message-scheduler] [com.vip.daas.client.DaasSession$DaasClientEndpoint] >>> Send heart beat message to master [10.199.210.210:9002]
[2023-09-04 18:57:43.098] [WARN] [SimpleAsyncTaskExecutor-69] [com.vip.vman.service.job.VmanConvertManager] >>> 有其他线程进行分析任务的数据迁移,暂停本次执行
[2023-09-04 18:57:43.099] [INFO] [SimpleAsyncTaskExecutor-69] [com.vip.vman.service.job.VmanConvertManager] >>> 关闭分析任务的锁
[2023-09-04 18:57:56.675] [INFO] [SimpleAsyncTaskExecutor-68] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:82,转换成功的任务信息:处理成功的分析任务id:62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,
[2023-09-04 18:58:15.756] [INFO] [SimpleAsyncTaskExecutor-68] [com.vip.vman.service.job.VmanConvertManager] >>> 关闭分析任务的锁
[2023-09-04 18:58:15.757] [INFO] [SimpleAsyncTaskExecutor-68] [com.vip.vman.client.zk.ZkLock] >>> zkLock release -> /vman/analyse_job/2023090418/lock2
[2023-09-04 18:58:16.890] [INFO] [SimpleAsyncTaskExecutor-70] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:2,转换成功的任务信息:处理成功的分析任务id:1,
[2023-09-04 18:58:36.962] [INFO] [SimpleAsyncTaskExecutor-70] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:22,转换成功的任务信息:处理成功的分析任务id:2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
[2023-09-04 18:58:41.901] [INFO] [client-forward-message-scheduler] [com.vip.daas.client.DaasSession$DaasClientEndpoint] >>> Send heart beat message to master [10.199.210.210:9002]
[2023-09-04 18:58:57.032] [INFO] [SimpleAsyncTaskExecutor-70] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:42,转换成功的任务信息:处理成功的分析任务id:22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,
[2023-09-04 18:59:17.101] [INFO] [SimpleAsyncTaskExecutor-70] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:62,转换成功的任务信息:处理成功的分析任务id:42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,
[2023-09-04 18:59:23.117] [WARN] [SimpleAsyncTaskExecutor-71] [com.vip.vman.service.job.VmanConvertManager] >>> 有其他线程进行分析任务的数据迁移,暂停本次执行
[2023-09-04 18:59:23.117] [INFO] [SimpleAsyncTaskExecutor-71] [com.vip.vman.service.job.VmanConvertManager] >>> 关闭分析任务的锁
[2023-09-04 18:59:37.173] [INFO] [SimpleAsyncTaskExecutor-70] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:82,转换成功的任务信息:处理成功的分析任务id:62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,
[2023-09-04 18:59:41.897] [INFO] [client-forward-message-scheduler] [com.vip.daas.client.DaasSession$DaasClientEndpoint] >>> Send heart beat message to master [10.199.210.210:9002]

3、使用 jstack 88023 |grep SimpleAsyncTaskExecutor-62 命令可以查看相关线程是否存在,可以看到,相关线程任务执行完成后,会自动消失

4、如果去掉异步,代码如下

 //@Async@Scheduled(fixedRate = 30_000)public void testThread() throws Exception{ZkLock lock = new ZkLock(zkJob.getZK(), "/vman/analyse_job/lock2");try {if (!lock.acquire(20, TimeUnit.SECONDS)) {log.warn("有其他线程进行分析任务的数据迁移,暂停本次执行");return;}StringBuilder sb = new StringBuilder("处理成功的分析任务id:");Integer startShareId = 1;Integer endShareId   = 60;Integer count = 0;while (startShareId.compareTo(endShareId) <= 0) {try {Thread.sleep(1000);sb.append(startShareId).append(",");} catch (Exception e) {log.info("自助分析任务批量转换异常,jobId:{},exception:{}", startShareId, e);}startShareId++;if (count++ % 20 == 0) {log.info("当前分析任务id:{},转换成功的任务信息:{}", startShareId, sb.toString());sb = new StringBuilder("处理成功的分析任务id:");}}}catch(Exception e) {log.info("定时任务,分析任务转换异常:{}",e);}finally {log.info("关闭分析任务的锁");lock.release();}}

发现任务执行的线程只有一个 叫 scheduling-1

[2023-09-04 19:52:57.765] [WARN] [scheduling-1] [org.apache.curator.utils.ZKPaths] >>> The version of ZooKeeper being used doesn't support Container nodes. CreateMode.PERSISTENT will be used instead.
[2023-09-04 19:52:59.394] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:2,转换成功的任务信息:处理成功的分析任务id:1,
[2023-09-04 19:53:19.465] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:22,转换成功的任务信息:处理成功的分析任务id:2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
[2023-09-04 19:53:39.533] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:42,转换成功的任务信息:处理成功的分析任务id:22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,
[2023-09-04 19:53:41.406] [INFO] [client-forward-message-scheduler] [com.vip.daas.client.DaasSession$DaasClientEndpoint] >>> Send heart beat message to master [10.199.210.210:9002]
[2023-09-04 19:53:58.616] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 关闭分析任务的锁
[2023-09-04 19:53:58.620] [INFO] [scheduling-1] [com.vip.vman.client.zk.ZkLock] >>> zkLock release -> /vman/analyse_job/2023090419/lock2
[2023-09-04 19:53:59.880] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:2,转换成功的任务信息:处理成功的分析任务id:1,
[2023-09-04 19:54:19.959] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:22,转换成功的任务信息:处理成功的分析任务id:2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
[2023-09-04 19:54:40.043] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:42,转换成功的任务信息:处理成功的分析任务id:22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,
[2023-09-04 19:54:41.405] [INFO] [client-forward-message-scheduler] [com.vip.daas.client.DaasSession$DaasClientEndpoint] >>> Send heart beat message to master [10.199.210.210:9002]
[2023-09-04 19:54:59.158] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 关闭分析任务的锁
[2023-09-04 19:54:59.160] [INFO] [scheduling-1] [com.vip.vman.client.zk.ZkLock] >>> zkLock release -> /vman/analyse_job/2023090419/lock2
[2023-09-04 19:54:59.384] [WARN] [Thread-51] [org.apache.curator.framework.recipes.locks.InterProcessSemaphoreV2] >>> Lease already released
org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /vma.vip.vip.com/vman/analyse_job/2023090419/lock2/leases/_c_2f05745b-600d-4d3c-aa61-eb518072383a-lease-0000000001at org.apache.zookeeper.KeeperException.create(KeeperException.java:111)at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)at org.apache.zookeeper.ZooKeeper.delete(ZooKeeper.java:873)at org.apache.curator.framework.imps.DeleteBuilderImpl$5.call(DeleteBuilderImpl.java:250)at org.apache.curator.framework.imps.DeleteBuilderImpl$5.call(DeleteBuilderImpl.java:244)at org.apache.curator.RetryLoop.callWithRetry(RetryLoop.java:109)at org.apache.curator.framework.imps.DeleteBuilderImpl.pathInForeground(DeleteBuilderImpl.java:241)at org.apache.curator.framework.imps.DeleteBuilderImpl.forPath(DeleteBuilderImpl.java:225)at org.apache.curator.framework.imps.DeleteBuilderImpl.forPath(DeleteBuilderImpl.java:35)at org.apache.curator.framework.recipes.locks.InterProcessSemaphoreV2$3.close(InterProcessSemaphoreV2.java:437)at org.apache.curator.framework.recipes.locks.InterProcessSemaphoreMutex.release(InterProcessSemaphoreMutex.java:67)at com.vip.vman.client.zk.ZkLock$1.run(ZkLock.java:59)at java.lang.Thread.run(Thread.java:750)
[2023-09-04 19:54:59.426] [ERROR] [Thread-51] [com.vip.vman.client.zk.ZK] >>> 
org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /vma.vip.vip.com/vman/analyse_job/2023090419/lock2/leasesat org.apache.zookeeper.KeeperException.create(KeeperException.java:111)at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)at org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1650)at org.apache.curator.framework.imps.GetChildrenBuilderImpl$3.call(GetChildrenBuilderImpl.java:230)at org.apache.curator.framework.imps.GetChildrenBuilderImpl$3.call(GetChildrenBuilderImpl.java:219)at org.apache.curator.RetryLoop.callWithRetry(RetryLoop.java:109)at org.apache.curator.framework.imps.GetChildrenBuilderImpl.pathInForeground(GetChildrenBuilderImpl.java:216)at org.apache.curator.framework.imps.GetChildrenBuilderImpl.forPath(GetChildrenBuilderImpl.java:207)at org.apache.curator.framework.imps.GetChildrenBuilderImpl.forPath(GetChildrenBuilderImpl.java:40)at com.vip.vman.client.zk.ZK.getChildrenNum(ZK.java:408)at com.vip.vman.client.zk.ZkLock$1.run(ZkLock.java:61)at java.lang.Thread.run(Thread.java:750)
[2023-09-04 19:54:59.431] [ERROR] [Thread-51] [com.vip.vman.client.zk.ZkLock] >>> 
java.lang.NullPointerExceptionat com.vip.vman.client.zk.ZkLock$1.run(ZkLock.java:61)at java.lang.Thread.run(Thread.java:750)
[2023-09-04 19:55:01.197] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:2,转换成功的任务信息:处理成功的分析任务id:1,
[2023-09-04 19:55:21.280] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:22,转换成功的任务信息:处理成功的分析任务id:2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
[2023-09-04 19:55:41.354] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:42,转换成功的任务信息:处理成功的分析任务id:22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,
[2023-09-04 19:55:41.400] [INFO] [client-forward-message-scheduler] [com.vip.daas.client.DaasSession$DaasClientEndpoint] >>> Send heart beat message to master [10.199.210.210:9002]
[2023-09-04 19:56:00.429] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 关闭分析任务的锁
[2023-09-04 19:56:00.430] [INFO] [scheduling-1] [com.vip.vman.client.zk.ZkLock] >>> zkLock release -> /vman/analyse_job/2023090419/lock2
[2023-09-04 19:56:01.644] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:2,转换成功的任务信息:处理成功的分析任务id:1,
[2023-09-04 19:56:21.693] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:22,转换成功的任务信息:处理成功的分析任务id:2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
[2023-09-04 19:56:41.403] [INFO] [client-forward-message-scheduler] [com.vip.daas.client.DaasSession$DaasClientEndpoint] >>> Send heart beat message to master [10.199.210.210:9002]
[2023-09-04 19:56:41.774] [INFO] [scheduling-1] [com.vip.vman.service.job.VmanConvertManager] >>> 当前分析任务id:42,转换成功的任务信息:处理成功的分析任务id:22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,

相关文章:

基于springboot实现多线程抢锁的demo

1、本代码基于定时调度和异步执行同时处理&#xff0c;如果只加异步处理&#xff0c;会导致当前任务未执行完&#xff0c;下个任务到点也不会触发执行 Scheduled(fixedRate 50_000)Asyncpublic void testThread() throws Exception{ZkLock lock new ZkLock(zkJob.getZK(), &q…...

Java I/O模型发展以及Netty网络模型的设计思想

Java I/O模型发展以及Netty网络模型的设计思想 I/O模型Java BIOJava NIOJava AIO NIO Reactor网络模型单Reactor单线程模型单Reactor多线程模型主从Reactor多线程模型 Netty通信框架 前言&#xff1a; BIO、NIO的代码实践参考&#xff1a;Java分别用BIO、NIO实现简单的客户端服…...

智能电网时代:数字孪生的崭露头角

随着科技的不断进步&#xff0c;数字孪生已经开始在电力行业崭露头角&#xff0c;为这个关键的行业带来了前所未有的机遇和潜力。本文就带大家了解一下数字孪生在哪些方面为电力行业做出改变&#xff0c;以及未来的创新应用。 首先&#xff0c;数字孪生可以提高电力系统运营效率…...

每日一题 501二叉搜素树中的众数(中序遍历)

题目 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST 满足如下定义&a…...

测试理论与方法----测试流程第三个环节:设计测试用例

测试流程第三个环节&#xff1a;设计测试用例&#xff1a;怎么测<——>测试需求的提取&#xff1a;测什么 ### 5、测试用例 描述&#xff1a;测试用例(TestCase)&#xff1a;是一份关于【具体测试步骤】的文档&#xff0c;是为了达到最佳的测试效果或高效揭露软件中潜藏的…...

C++多态案例2----制作饮品

#include<iostream> using namespace std;//制作饮品的大致流程都为&#xff1a; //煮水-----冲泡-----倒入杯中----加入辅料//本案例利用多态技术&#xff0c;提供抽象类制作饮品基类&#xff0c;提供子类制作茶叶和咖啡class AbstractDrinking {public://煮水//冲水//倒…...

机械零件保养3d模拟演示打消客户购买顾虑

复杂机械的工作运转是复杂的&#xff0c;想要对机械有深度的理解和迭代&#xff0c;必须了解它的运转原理及参数&#xff0c;复杂机械运行原因教学存在着不可视、系统庞杂及知识点多等弊病&#xff0c;3D虚拟展示是基于web3d网页运行的三维页面&#xff0c;可以将复杂机械运行过…...

SpringBoot的自动装配源码分析

文章目录 一&#xff1a;什么是自动装配二、springboot的启动流程1.调用SpringApplication&#xff08;&#xff09;的构造方法2.执行核心run方法&#xff08;&#xff09;3.执行核心prepareContext&#xff08;&#xff09;4.执行核心refreshContext&#xff08;&#xff09;5…...

Linux常用命令——csplit命令

在线Linux命令查询工具 csplit 将一个大文件分割成小的碎片文件 补充说明 csplit命令用于将一个大文件分割成小的碎片&#xff0c;并且将分割后的每个碎片保存成一个文件。碎片文件的命名类似“xx00”&#xff0c;“xx01”。csplit命令是split的一个变体&#xff0c;split只…...

React 组件的3大属性: state

state 一、理解二、用途三、使用3.1、类初始化3.2、函数初始化 四、状态读更4.1、组件内部状态管理和数据更新4.2、state 和 props 一起使用 一、理解 组件被称为"状态机", 页面的显示是根据组件的state 属性的数据来显示。 state 是一个用于存储和管理组件内部数据的…...

vscode 上传项目到gitlab

第一步初始化项目 如果没有创建过分支&#xff08;创建分支这里不记录&#xff09;&#xff0c;默认是master分支&#xff1a; ①将所需要的上传的文件添加到暂存区&#xff0c;如图&#xff1a; ②填写一下注释信息&#xff0c;将暂存区的文件上传到本地分支&#xff08;没有创…...

[羊城杯 2020] easyphp

打开题目&#xff0c;源代码 <?php$files scandir(./); foreach($files as $file) {if(is_file($file)){if ($file ! "index.php") {unlink($file);}}}if(!isset($_GET[content]) || !isset($_GET[filename])) {highlight_file(__FILE__);die();}$content $_GE…...

QT 常用类与组件

0 思维导图 1 信息调试类&#xff08;QDebug&#xff09; #include "widget.h" #include<iostream> //printf #include<QDebug> //qDebuf using namespace std; //coutWidget::Widget(QWidget *parent): QWidget(parent) {//输出函数//使用…...

C#控制台连接Mysql数据库,有配置数据库连接字符串的配置文件

C#控制台连接Mysql数据库&#xff0c;有配置数据库连接字符串的配置文件 实现功能 读取..txt 中的配置文件&#xff0c;来初始化连接字符串让连接字符串的配置文件不存在会主动创建默认的连接字符串 注意点&#xff1a; 需要引用Newtonsoft使用mysql 代码如下 using Syst…...

PowerBuilder连接SQLITE3

PowerBuilder,一个古老的IDE,打算陆续发些相关的,也许还有人需要,内容可能涉及其他作者,但基本都是基于本人实践整理,如涉及归属,请联系. SQLite,轻型数据库,相对与PowerBuilder来说是个新事务,故发数来,以供参考. PB中使用OLE Microsoft OLE DB方式进行连接,如下 // Profile…...

Git 基本原理和常用操作

Git Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开源的版本控制软件。 Git 常用操作 git 提交流程&#xff1a;工作区 -> git add 到暂存区 -> gi…...

单元测试和集成测试的区别

单元测试和集成测试是软件开发中常用的两种测试方法&#xff0c;它们的主要区别如下&#xff1a; 范围不同&#xff1a;单元测试关注于对软件中的最小功能单元进行测试&#xff0c;通常是对独立的函数、方法或类进行测试。而集成测试则更加综合&#xff0c;涉及多个模块、组件或…...

node基础概念

前言&#xff1a;可以让别人访问我们的网页&#xff0c;可以开发服务端应用、工具类应用、桌面端应用&#xff08;electron&#xff09; 1. 计算机基础 概念&#xff1a;CPU 内存 硬盘 主板 显卡 2. 进程和线程 概念&#xff1a;进程是一个程序的执行&#xff0c;线程组合形…...

ArcGIS Maps SDK for JS(二):MapView简介----创建2D地图

文章目录 1 AMD 引用 ArcGIS Maps SDK for JavaScript2 加载相应模块3 创建地图4 创建 2D 视图 view5 确定页面内容6 CSS 样式7 完整代码 本教程使用 AMD 模块&#xff0c;指导您如何在二维地图视图中创建一个简单的地图。 1 AMD 引用 ArcGIS Maps SDK for JavaScript 在 <…...

知识图谱推理研究综述9.3

综述分类 根据样本量大小的不同&#xff0c;将知识图谱推理方法分为多样本推理、少样本推理和零与单样本推理 KG定义&#xff1a;&#xff08;Y&#xff09; 知识图谱是以图的形式表示真实世界的实体与关系之间关系的知识库。 具体来说知识图谱是通过将应用数学、图形学、信…...

实测Qwen-Image-Edit-2511:输入一张图,输出360°环绕视角,效果太强了

实测Qwen-Image-Edit-2511&#xff1a;输入一张图&#xff0c;输出360环绕视角&#xff0c;效果太强了 1. 引言&#xff1a;单图变多视角的技术突破 想象一下&#xff0c;你只需要一张普通的商品照片&#xff0c;就能自动生成360度全方位的展示效果。这不是科幻电影里的场景&…...

保姆级教学:用FUTURE POLICE和MySQL管理你的语音字幕数据

保姆级教学&#xff1a;用FUTURE POLICE和MySQL管理你的语音字幕数据 1. 为什么需要管理语音字幕数据&#xff1f; 想象一下这样的场景&#xff1a;你刚刚用FUTURE POLICE处理了100个会议录音&#xff0c;得到了精确到毫秒的字幕文件。这些文件散落在各个文件夹里&#xff0c…...

AI CRM 2.0时代:SaaS厂商的生死局

今天的SaaS厂商&#xff0c;要么彻底重构底层架构&#xff0c;要么被时代抛弃。原创&#xff1a;首席数智官 封面&#xff1a;AI“未来每一家SaaS公司都会成为AaaS&#xff08;Agentic as a Service&#xff09;公司。”这是英伟达创始人、CEO黄仁勋在GTC 2026演讲中给出的判断…...

毕业设计作品精选【芳芯科技】酒驾检测座椅设计

实物效果图&#xff1a;实现功能&#xff1a;有人的情况下&#xff0c;单片机实时采集周围的酒精浓度&#xff0c;如果超出&#xff0c;蜂鸣器报警&#xff0c;LED闪烁。检测座位重量和检测人体发射的红外&#xff0c;两者都满足认为座位有人&#xff0c;否则无人。配有显示屏进…...

MogFace-large效果对比:在遮挡/小脸/密集场景下超越YOLOv8与RetinaFace实测

MogFace-large效果对比&#xff1a;在遮挡/小脸/密集场景下超越YOLOv8与RetinaFace实测 1. 引言&#xff1a;人脸检测的现实挑战 在实际应用中&#xff0c;人脸检测面临着三大难题&#xff1a;遮挡、小脸和密集场景。当人脸被口罩、眼镜或其他人遮挡时&#xff0c;传统检测器…...

连锁经营行业商旅平台选型指南与测评排名Top 6:多门店与全链路商旅管控方案

2026年4月的第一周&#xff0c;艾美咨询发布了《2026年中国连锁经营行业商旅管理数字化白皮书》&#xff0c;数据显示国内规模以上连锁经营企业的商旅支出占整体运营成本的8.7%&#xff0c;其中私车公用、门店巡检类商旅的合规漏洞造成的浪费占总商旅支出的19.2%&#xff0c;连…...

打造纯净浏览环境:AdGuard浏览器扩展全方位部署与优化指南

打造纯净浏览环境&#xff1a;AdGuard浏览器扩展全方位部署与优化指南 【免费下载链接】AdguardBrowserExtension AdGuard browser extension 项目地址: https://gitcode.com/gh_mirrors/ad/AdguardBrowserExtension 一、核心优势解析&#xff1a;重新定义广告拦截技术标…...

3步上手AssetStudio:从Unity游戏资源提取到格式转换全攻略

3步上手AssetStudio&#xff1a;从Unity游戏资源提取到格式转换全攻略 【免费下载链接】AssetStudio AssetStudio - Based on the archived Perfares AssetStudio, I continue Perfares work to keep AssetStudio up-to-date, with support for new Unity versions and additio…...

从演示到实战:基于快马平台构建一个功能完整的AI绘画社区应用

今天想和大家分享一个很有意思的实战项目 - 在InsCode(快马)平台上构建一个功能完整的AI绘画社区应用。这个想法来源于阿里悟空官网展示的AI绘画应用场景&#xff0c;但我们要做的是更贴近真实产品的综合性解决方案。 项目整体规划 首先需要明确&#xff0c;一个完整的AI绘画社…...

收藏必备!小白程序员轻松入门大模型,带你理清AI核心概念全框架

AI浪潮已经刮了一年多&#xff0c;身边越来越多人聊AI&#xff0c;张口就是“agent”“skill”&#xff0c;听得人只能点头附和&#xff0c;似懂非懂&#xff1f;其实不是听不懂&#xff0c;而是没有把这些概念串起来&#xff0c;告诉你它们到底是什么、彼此有啥关系。 咱不聊复…...