普通用户
请问多线程临界 怎么加入 [复制链接]
小龙APP 发表于 2026-04-06 90 8

我目前使用多线程 有时候会同时出现  我想在 子程序判断那加入 临界 排队操作 请问要怎么处理

函数 哈希方式限制打印数量(弹幕  文本型)  逻辑型
    变量 内容是否存在  逻辑型 = 
    变量 限制打印状态  逻辑型 = 
    限制打印哈希.创建遍历()
    判断循环(限制打印哈希.取下一个())
        变量 key  文本型 = 限制打印哈希.取项目值()
        变量 ID  文本型 = 限制打印哈希.取项目键()
        如果(取相等(弹幕,ID) == )
            内容是否存在 = 
            变量 当前内容时间戳  文本型 = 取文本左边(key,10)
            变量 当前打印数量  文本型 = 取文本右边(key,取文本长度(key)-10)
            如果(到整数(取现行时间戳(2))-到整数(当前内容时间戳) > 到整数(读取设置("限制秒数")))
                限制打印状态 = 
                限制打印哈希.添加项目(弹幕,取现行时间戳(2)+"1")
                否则
                如果(到整数(当前打印数量) >= 到整数(读取设置("打印数量")))
                    限制打印状态 = 
                    否则
                    限制打印状态 = 
                    限制打印哈希.添加项目(弹幕,取现行时间戳(2) + 到文本(到整数(当前打印数量)+1))
                    '限制打印哈希.添加项目(弹幕,取现行时间戳(2) + 到整数(当前打印数量)+1)
                结束 如果
            结束 如果
            跳过
        结束 如果        
    结束循环
    如果(内容是否存在 == )
        限制打印哈希.添加项目(弹幕,取现行时间戳(2)+"1")
    结束 如果
    如果(到整数(读取设置("打印数量")) > 20)
        返回()
        否则
        返回(限制打印状态)
    结束 如果
结束 函数

这是我目前的逻辑 我想给他排队处理

小龙APP 2026-04-08
引用 @Course 的回复:

两种解决方式:

方法1.不要在子线程中启用子线程,因为子线程已经是后台线程了,更不建议每一秒就启动一个子线程,这种写法,如果一旦某个静态对象长期持有引用,APP运行久了必崩,还不容易找出原因。

函数:启动直播间本身就是在子线程中执行了,同时OK网络操作发送的请求也是在子线程中,您的写法相当于是:启动子线程(在子线程内又启动子线程,然后在这个二级子线程中又用OK网络操作(内部)启动子线程发送请求)

优化代码:

函数 启动直播间()
    判断循环(检测状态)
        变量 连接  文本型 = "http://bbs.vcnstudio.com/"
        ok网络操作1.执行简单Get请求("弹幕信息",连接,接收所有请求结果)
        调试输出(时间戳,连接)
        延时(1000) 
    结束循环
结束 函数

方法2.保持您的写法不变,给“限制打印哈希”这个对象加锁,在使用它之前。

函数 处理弹幕(昵称  文本型,内容  文本型,时间  文本型,uid  文本型,用户名  文本型)    synchronized (限制打印哈希){
        如果(哈希方式限制打印数量(内容) == )
	    处理结果 = "限制"
	否则
	    处理结果 = "通过"
        结束 如果
    }
结束 函数


好的 感谢 我试试方法1

回复
官方技术组 2026-04-07

两种解决方式:

方法1.不要在子线程中启用子线程,因为子线程已经是后台线程了,更不建议每一秒就启动一个子线程,这种写法,如果一旦某个静态对象长期持有引用,APP运行久了必崩,还不容易找出原因。

函数:启动直播间本身就是在子线程中执行了,同时OK网络操作发送的请求也是在子线程中,您的写法相当于是:启动子线程(在子线程内又启动子线程,然后在这个二级子线程中又用OK网络操作(内部)启动子线程发送请求)

优化代码:

函数 启动直播间()
    判断循环(检测状态)
        变量 连接  文本型 = "http://bbs.vcnstudio.com/"
        ok网络操作1.执行简单Get请求("弹幕信息",连接,接收所有请求结果)
        调试输出(时间戳,连接)
        延时(1000) 
    结束循环
结束 函数

方法2.保持您的写法不变,给“限制打印哈希”这个对象加锁,在使用它之前。

函数 处理弹幕(昵称  文本型,内容  文本型,时间  文本型,uid  文本型,用户名  文本型)    synchronized (限制打印哈希){
        如果(哈希方式限制打印数量(内容) == )
	    处理结果 = "限制"
	否则
	    处理结果 = "通过"
        结束 如果
    }
结束 函数


回复
小龙APP 2026-04-07
引用 @Course 的回复:

如果只是在单个子线程线程中调用,是不会出现抢占情况的,目前看代码感觉多半是您代码逻辑问题,麻烦请贴出完整代码看下。

事件 按钮9.被单击(来源对象  视图)
  启动线程(&启动直播间)
结束 事件



函数 启动直播间()
    '时钟1.时钟周期 = 100
    '时钟1.可用 = 真
    判断循环(检测状态)
        
        变量 连接  文本型 = "http://bbs.vcnstudio.com/"
        调试输出(时间戳,连接)
        异步执行首
            ok网络操作1.执行简单Get请求("弹幕信息",连接,接收所有请求结果)
            到主线程
        异步执行尾
        延时(1000) 
    结束循环
结束 函数

定义 接收所有请求结果  OK网络操作.文本请求回调接口
    事件 请求成功(响应对象  OK网络请求响应)
        如果(响应对象 == )
            返回
        结束 如果
        变量 请求标记 =到文本(响应对象.取请求标记())
        如果(请求标记 == "验证")
            变量 jObja = 创建 JSON对象()
            变量 str  文本型 = 响应对象.取响应体()
            jObja.解析(str)  
            变量 code  文本型 =jObja.取文本("code")
            变量 jsona  JSON对象 = jObja.取Json对象("data")
            变量 jData  JSON数组 = jsona.取Json数组("message")
            变量循环(i = 0,jData.取成员数(),1)
                变量 zjson  JSON对象 = jData.取Json对象(i)
                变量 nickname  文本型 = zjson.取文本("nickname")
                变量 content  文本型 = zjson.取文本("content")
                变量 timestamp  文本型 = zjson.取文本("time")
                处理弹幕(nickname,content,timestamp,uid,nickname)
            结束循环
        结束 如果
结束 定义
函数 处理弹幕(昵称  文本型,内容  文本型,时间  文本型,uid  文本型,用户名  文本型)
    如果(哈希方式限制打印数量(内容) == )
        处理结果 = "限制"
        否则
        处理结果 = "通过"
    结束 如果
结束 函数
回复
官方技术组 2026-04-07

如果只是在单个子线程线程中调用,是不会出现抢占情况的,目前看代码感觉多半是您代码逻辑问题,麻烦请贴出完整代码看下。

回复
小龙APP 2026-04-07
引用 @Course 的回复:

您好,会临时出现什么呢?

没看懂您这段代码具体问题,“限制打印哈希.创建遍历()”这个“限制打印哈希”是窗口成员吗?您是想依次排队打印这个哈希表中的内容吗?

如果您需要在多线程中依次排队打印,理论上你这个代码在执行的时候就是按照循环排队执行的代码,不会出现并发情况。

一般只有在线程中使用并发或者同时开启多个线程的时候,才会导致资源被抢占。

例如:现在哈希表中有20个成员,您先将其分成4组数据,每组5个数据,然后每次创建5个线程同时并发执行(这5个线程是无序的,不分先后,因此可能同时执行,同时抢占某个对象资源),此时才需要处理排队,而您当前这种情况是单线程执行,不存在临界状态,也不需要加锁等操作。

这个子程序 是多线程会调用 导致了 抢占 这个 锁 请问怎么加

回复
小龙APP 2026-04-07
引用 @Course 的回复:

您好,会临时出现什么呢?

没看懂您这段代码具体问题,“限制打印哈希.创建遍历()”这个“限制打印哈希”是窗口成员吗?您是想依次排队打印这个哈希表中的内容吗?

如果您需要在多线程中依次排队打印,理论上你这个代码在执行的时候就是按照循环排队执行的代码,不会出现并发情况。

一般只有在线程中使用并发或者同时开启多个线程的时候,才会导致资源被抢占。

例如:现在哈希表中有20个成员,您先将其分成4组数据,每组5个数据,然后每次创建5个线程同时并发执行(这5个线程是无序的,不分先后,因此可能同时执行,同时抢占某个对象资源),此时才需要处理排队,而您当前这种情况是单线程执行,不存在临界状态,也不需要加锁等操作。

是窗口成员  开启并发后 会出现同时在执行这个限制打印哈希 导致有时候两个相同同时添加项目进去   返回了 真 理论是相同的应该只能返回一个真

回复
官方技术组 2026-04-07

如果需要处理对象资源被抢占问题,可以参考开发文档:多线程-线程同步 相关内容。

回复
官方技术组 2026-04-07

您好,会临时出现什么呢?

没看懂您这段代码具体问题,“限制打印哈希.创建遍历()”这个“限制打印哈希”是窗口成员吗?您是想依次排队打印这个哈希表中的内容吗?

如果您需要在多线程中依次排队打印,理论上你这个代码在执行的时候就是按照循环排队执行的代码,不会出现并发情况。

一般只有在线程中使用并发或者同时开启多个线程的时候,才会导致资源被抢占。

例如:现在哈希表中有20个成员,您先将其分成4组数据,每组5个数据,然后每次创建5个线程同时并发执行(这5个线程是无序的,不分先后,因此可能同时执行,同时抢占某个对象资源),此时才需要处理排队,而您当前这种情况是单线程执行,不存在临界状态,也不需要加锁等操作。

回复
 作者信息
小龙APP
USBV4独立版
专业开发指导服务

响应时间:5分钟

服务方式:官方1对1服务

工作时间:工作日 9:00 - 18:30

专业团队 · 开发指导 · 极速响应


官网 | 基础视频教程 | 在线文档 下载 VcnStudio IDE

© VcnStudio Inc All Rights Reserved

蜀ICP备17024229号