ColdFusion 动态线程名称
ColdFusion dynamic thread names
如何在 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>
之外我找不到实例化它们的方法,这不允许我将线程创建为结构成员。这是我尝试过的:
尝试 1
<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>
Element ... is undefined in a CFML structure referenced as part of an expression.
这个在抛出错误之前得到了输出。我真的没想到线程在变量范围内,但我不能指定范围,我也找不到它内置的范围。简而言之,我不知道如何从那里访问线程:
尝试 2
<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>
Element ... is undefined in a Java object of type class coldfusion.runtime.VariableScope.
非动态示例
作为参考,下面是代码在尝试输入 uuid 之前的样子
<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>
为了简化示例,我更新了这个答案。以前,我将线程名称存储在应用程序变量键中。这是不必要的,除非您希望在全球范围内存储这些值。 'variables'范围已经足够了。
重要提示:
当您使用'run' 操作时,它是一个'set & forget' 操作。除非加入线程,否则不能从外部访问任何创建的线程范围变量。
另一种方法是在共享范围内创建变量,例如 'application' 或 'session' 范围。从线程内对共享范围变量所做的任何更改都可以在外部访问。
实施:
通过使用 'attributes' 作用域传入线程名称来访问它。通过在线程中存储线程名称,您可以确保线程已执行并将存在,在线程被加入时。
<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>
如何在 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>
之外我找不到实例化它们的方法,这不允许我将线程创建为结构成员。这是我尝试过的:
尝试 1
<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>
Element ... is undefined in a CFML structure referenced as part of an expression.
这个在抛出错误之前得到了输出。我真的没想到线程在变量范围内,但我不能指定范围,我也找不到它内置的范围。简而言之,我不知道如何从那里访问线程:
尝试 2
<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>
Element ... is undefined in a Java object of type class coldfusion.runtime.VariableScope.
非动态示例
作为参考,下面是代码在尝试输入 uuid 之前的样子
<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>
为了简化示例,我更新了这个答案。以前,我将线程名称存储在应用程序变量键中。这是不必要的,除非您希望在全球范围内存储这些值。 'variables'范围已经足够了。
重要提示:
当您使用'run' 操作时,它是一个'set & forget' 操作。除非加入线程,否则不能从外部访问任何创建的线程范围变量。 另一种方法是在共享范围内创建变量,例如 'application' 或 'session' 范围。从线程内对共享范围变量所做的任何更改都可以在外部访问。
实施:
通过使用 'attributes' 作用域传入线程名称来访问它。通过在线程中存储线程名称,您可以确保线程已执行并将存在,在线程被加入时。
<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>