【发布时间】:2019-03-12 20:23:57
【问题描述】:
如何在 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>
元素 ... 在作为表达式的一部分引用的 CFML 结构中未定义。
在抛出错误之前,这个会一直到输出。我真的没想到线程会在变量范围内,但我无法指定范围,也找不到它内置的范围。简而言之,我不知道如何从那里访问线程:
尝试 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>
元素 ... 在类型为coldfusion.runtime.VariableScope 的Java 对象中未定义。
非动态示例
作为参考,下面是代码在尝试放入 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>
【问题讨论】:
-
你不能像那样访问线程。您可以在线程完成后加入线程,但不能简单地写入正在运行的线程内的变量,除非它在共享范围内(如应用程序或会话),但即使这样做也最好小心。
-
我不确定你的意思。在线程内部创建的变量有自己的范围,可以在它们加入后访问。
-
你的例子是错误的。我不确定你在执行 thread[name].variableName = 1; 时要做什么也许您可以解释一下您要完成的工作。
标签: multithreading coldfusion coldfusion-10