如何在ColdFusion中访问动态线程名称?通常,如果我使用动态变量名称,我会做这样的事情:
<cfloop from="1" to="10" index="counter" >
<cfset Names[counter] = rereplace( createUUID(), "[-_\.]", "", "all") />
<cfset something[ Names[counter] ] = 1 />
</cfloop>
<cfoutput>
#( something[ Names[1] ] + something[ Names[2] ] + something[ Names[3] ] )#
</cfoutput>
但是,尝试使用线程执行此操作似乎更棘手,因为除了使用<cfthread>
之外我无法找到实例化它们的方法,<cfloop from="1" to="10" index="counter" >
<cfset ThreadNames[counter] = rereplace( createUUID(), "[-_\.]", "", "all") />
<cfthread action="run" name="#something[ ThreadNames[counter] ]#" >
<cfset Thread.something = 1 />
</cfthread>
</cfloop>
不希望允许我创建线程作为结构成员。这是我尝试过的:
尝试1
<cfloop from="1" to="10" index="counter" >
<cfset ThreadNames[counter] = rereplace( createUUID(), "[-_\.]", "", "all") />
<cfthread action="run" name="#ThreadNames[counter]#" >
<cfset Thread.something = 1 />
</cfthread>
</cfloop>
<cfthread action="join" name="#ThreadNames[1]#, #ThreadNames[2]#, #ThreadNames[3]#" />
<cfoutput>
#( VARIABLES[ThreadNames[1]].something + VARIABLES[ThreadNames[2]].something + VARIABLES[ThreadNames[3]].something )#
</cfoutput>
元素...在作为表达式的一部分引用的CFML结构中未定义。
在抛出错误之前,这个到达输出。我真的不希望线程在变量范围内,但我不能指定范围,我也找不到它内置的范围。简而言之,我无法弄清楚如何从那里访问线程:
尝试2
<cfloop from="1" to="10" index="counter" >
<cfthread action="run" name="thread#counter#" >
<cfset Thread.something = 1 />
</cfthread>
</cfloop>
<cfthread action="join" name="thread1, thread2, thread3" />
<cfoutput>
#( thread1.something + thread2.something + thread3.something )#
</cfoutput>
Element ...在类coldfusion.runtime.VariableScope类型的Java对象中未定义。
非动态示例
作为参考,这里是代码在尝试抛出uuids之前的样子
<cfset variables.threadNames = {} />
<cfloop from="1" to="10" index="counter" >
<cfset variables.threadName = REReplace(CreateUUID(), "[-]", "", "all") />
<cfthread action="run" name="#variables.threadName#" threadName="#variables.threadName#" counter="#counter#">
<cfset thread.something = attributes.counter />
<cfset variables.threadNames[attributes.threadName] = thread.something />
</cfthread>
</cfloop>
<cfthread action="join" name="#StructKeyList(variables.threadNames)#" timeout="6000" />
<cfloop collection="#variables.threadNames#" item="key">
<cfset variables.thread = cfthread[key]>
<cfdump var="#variables.thread#" />
</cfloop>
我已经更新了这个答案,以简化我的例子。以前,我已将线程名称存储在应用程序变量键中。除非您希望全局存储值,否则这是不必要的。 “变量”范围已经足够了。
重要:
当您使用“运行”操作时,它是一个“设置并忘记”操作。除非线程已连接,否则无法从外部访问创建的任何线程范围变量。另一种方法是在共享范围内创建变量,例如“应用程序”或“会话”范围。可以从外部访问对线程内的共享范围变量所做的任何更改。
执行:
使用“属性”范围通过传入线程名称来访问线程名称。通过在线程中存储线程名称,可以确保线程已经执行并且在线程连接时将存在。
qazxswpoi