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>