我目前使用多线程 有时候会同时出现 我想在 子程序判断那加入 临界 排队操作 请问要怎么处理
函数 哈希方式限制打印数量(弹幕 为 文本型) 为 逻辑型
变量 内容是否存在 为 逻辑型 = 假
变量 限制打印状态 为 逻辑型 = 假
限制打印哈希.创建遍历()
判断循环(限制打印哈希.取下一个())
变量 key 为 文本型 = 限制打印哈希.取项目值()
变量 ID 为 文本型 = 限制打印哈希.取项目键()
如果(取相等(弹幕,ID) == 真)
内容是否存在 = 真
变量 当前内容时间戳 为 文本型 = 取文本左边(key,10)
变量 当前打印数量 为 文本型 = 取文本右边(key,取文本长度(key)-10)
如果(到整数(取现行时间戳(2))-到整数(当前内容时间戳) > 到整数(读取设置("限制秒数")))
限制打印状态 = 假
限制打印哈希.添加项目(弹幕,取现行时间戳(2)+"1")
否则
如果(到整数(当前打印数量) >= 到整数(读取设置("打印数量")))
限制打印状态 = 真
否则
限制打印状态 = 假
限制打印哈希.添加项目(弹幕,取现行时间戳(2) + 到文本(到整数(当前打印数量)+1))
'限制打印哈希.添加项目(弹幕,取现行时间戳(2) + 到整数(当前打印数量)+1)
结束 如果
结束 如果
跳过
结束 如果
结束循环
如果(内容是否存在 == 假)
限制打印哈希.添加项目(弹幕,取现行时间戳(2)+"1")
结束 如果
如果(到整数(读取设置("打印数量")) > 20)
返回(假)
否则
返回(限制打印状态)
结束 如果
结束 函数这是我目前的逻辑 我想给他排队处理
两种解决方式:
方法1.不要在子线程中启用子线程,因为子线程已经是后台线程了,更不建议每一秒就启动一个子线程,这种写法,如果一旦某个静态对象长期持有引用,APP运行久了必崩,还不容易找出原因。
函数:启动直播间本身就是在子线程中执行了,同时OK网络操作发送的请求也是在子线程中,您的写法相当于是:启动子线程(在子线程内又启动子线程,然后在这个二级子线程中又用OK网络操作(内部)启动子线程发送请求)
优化代码:
函数 启动直播间()
判断循环(检测状态)
变量 连接 为 文本型 = "http://bbs.vcnstudio.com/"
ok网络操作1.执行简单Get请求("弹幕信息",连接,接收所有请求结果)
调试输出(时间戳,连接)
延时(1000)
结束循环
结束 函数方法2.保持您的写法不变,给“限制打印哈希”这个对象加锁,在使用它之前。
函数 处理弹幕(昵称 为 文本型,内容 为 文本型,时间 为 文本型,uid 为 文本型,用户名 为 文本型) synchronized (限制打印哈希){
如果(哈希方式限制打印数量(内容) == 真)
处理结果 = "限制"
否则
处理结果 = "通过"
结束 如果
}
结束 函数好的 感谢 我试试方法1
两种解决方式:
方法1.不要在子线程中启用子线程,因为子线程已经是后台线程了,更不建议每一秒就启动一个子线程,这种写法,如果一旦某个静态对象长期持有引用,APP运行久了必崩,还不容易找出原因。
函数:启动直播间本身就是在子线程中执行了,同时OK网络操作发送的请求也是在子线程中,您的写法相当于是:启动子线程(在子线程内又启动子线程,然后在这个二级子线程中又用OK网络操作(内部)启动子线程发送请求)
优化代码:
函数 启动直播间()
判断循环(检测状态)
变量 连接 为 文本型 = "http://bbs.vcnstudio.com/"
ok网络操作1.执行简单Get请求("弹幕信息",连接,接收所有请求结果)
调试输出(时间戳,连接)
延时(1000)
结束循环
结束 函数方法2.保持您的写法不变,给“限制打印哈希”这个对象加锁,在使用它之前。
函数 处理弹幕(昵称 为 文本型,内容 为 文本型,时间 为 文本型,uid 为 文本型,用户名 为 文本型) synchronized (限制打印哈希){
如果(哈希方式限制打印数量(内容) == 真)
处理结果 = "限制"
否则
处理结果 = "通过"
结束 如果
}
结束 函数如果只是在单个子线程线程中调用,是不会出现抢占情况的,目前看代码感觉多半是您代码逻辑问题,麻烦请贴出完整代码看下。
事件 按钮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 为 文本型,用户名 为 文本型)
如果(哈希方式限制打印数量(内容) == 真)
处理结果 = "限制"
否则
处理结果 = "通过"
结束 如果
结束 函数
如果只是在单个子线程线程中调用,是不会出现抢占情况的,目前看代码感觉多半是您代码逻辑问题,麻烦请贴出完整代码看下。
您好,会临时出现什么呢?
没看懂您这段代码具体问题,“限制打印哈希.创建遍历()”这个“限制打印哈希”是窗口成员吗?您是想依次排队打印这个哈希表中的内容吗?
如果您需要在多线程中依次排队打印,理论上你这个代码在执行的时候就是按照循环排队执行的代码,不会出现并发情况。
一般只有在线程中使用并发或者同时开启多个线程的时候,才会导致资源被抢占。
例如:现在哈希表中有20个成员,您先将其分成4组数据,每组5个数据,然后每次创建5个线程同时并发执行(这5个线程是无序的,不分先后,因此可能同时执行,同时抢占某个对象资源),此时才需要处理排队,而您当前这种情况是单线程执行,不存在临界状态,也不需要加锁等操作。
这个子程序 是多线程会调用 导致了 抢占 这个 锁 请问怎么加
您好,会临时出现什么呢?
没看懂您这段代码具体问题,“限制打印哈希.创建遍历()”这个“限制打印哈希”是窗口成员吗?您是想依次排队打印这个哈希表中的内容吗?
如果您需要在多线程中依次排队打印,理论上你这个代码在执行的时候就是按照循环排队执行的代码,不会出现并发情况。
一般只有在线程中使用并发或者同时开启多个线程的时候,才会导致资源被抢占。
例如:现在哈希表中有20个成员,您先将其分成4组数据,每组5个数据,然后每次创建5个线程同时并发执行(这5个线程是无序的,不分先后,因此可能同时执行,同时抢占某个对象资源),此时才需要处理排队,而您当前这种情况是单线程执行,不存在临界状态,也不需要加锁等操作。
是窗口成员 开启并发后 会出现同时在执行这个限制打印哈希 导致有时候两个相同同时添加项目进去 返回了 真 理论是相同的应该只能返回一个真
如果需要处理对象资源被抢占问题,可以参考开发文档:多线程-线程同步 相关内容。
您好,会临时出现什么呢?
没看懂您这段代码具体问题,“限制打印哈希.创建遍历()”这个“限制打印哈希”是窗口成员吗?您是想依次排队打印这个哈希表中的内容吗?
如果您需要在多线程中依次排队打印,理论上你这个代码在执行的时候就是按照循环排队执行的代码,不会出现并发情况。
一般只有在线程中使用并发或者同时开启多个线程的时候,才会导致资源被抢占。
例如:现在哈希表中有20个成员,您先将其分成4组数据,每组5个数据,然后每次创建5个线程同时并发执行(这5个线程是无序的,不分先后,因此可能同时执行,同时抢占某个对象资源),此时才需要处理排队,而您当前这种情况是单线程执行,不存在临界状态,也不需要加锁等操作。