我对使用Ant fork方法的多线程编程有疑问
以下是Jar文件和相关的java类和方法
Test1.jar有 --Test1.java有 --MethodA()
Test2.jar有 --Test2.java有 --MethodB()
Test3.jar有 --Test3.java有 --MethodC()
runtime.classpath将有:Test1.jar,Test2.jar和Test3.jar
testsuite.list: Test1.tsv,Test2.tsv,Test3.tsv
Test1.tsv --> calls MethodC(), MethodB(), MethodA() in sequence
Test2.tsv --> calls MethodA(), MethodB(), MethodA() in sequence
Test3.tsv --> calls MethodB(), MethodA(), MethodA() in sequence
Ant sciprt:
<for list="${testsuite.list}" param="testsuite" parallel="true" threadCount="3">
<sequential>
<local name="cmdLine.args" />
<property name="cmdLine.args" value="--variable ENV:${env.file} --listener TListener ${tag.option} @{testsuite}"/>
<java classname="org.TestWork" classpathref="runtime.classpath" fork="true" maxmemory="1024M">
<arg line="${cmdLine.args}"/>
</java>
</sequential>
</for>
<java classname="org.TestWork" classpathref="runtime.classpath" fork="true" maxmemory="1024M">
<arg value="--output"/>
<arg value="output.xml"/>
</java>
当Ant脚本被触发时
线程1拾取Test1.tsv 线程2拾取Test2.tsv 线程3拾取Test3.tsv
现在我的问题是3个线程并行执行,每个Test1.java,Test2.java和Test3.java的3个实例被创建或者只有一个Test1.java,Test2.java和Test3.java的实例?
如果在Thread1执行MethodA()时只创建了Test1.java,Test2.java和Test3.java的一个实例,则Thread2必须等待,直到Thread1完成MethodA()执行?
有些人可以帮助我理解这一点。另外,有没有一种方法我可以知道一次执行给定方法的线程数量,是否发生了锁定或创建了多少个java实例?
需要注意的另一点是我的MethodA(),MethodB(),MethodC()具有等待时间和重试机制来查找Web元素的实现。所以我不确定多线程何时执行正在发生的事情。有时我看到很多延迟来完成方法执行,所以想知道是否有任何锁定发生。
答案 0 :(得分:0)
根据您的描述,我有一些线程访问的共享全局资源。所以线程应该共享共享资源而不是分开的资源。
如果只创建了Test1.java,Test2.java和Test3.java的一个实例 当Thread1执行MethodA()时,Thread2必须等到Thread1 完成MethodA()执行?
是的,正确。但没人能保证订单。
另外,有没有办法可以知道执行的线程数量 方法一次?
是的,有几种方法可以做,
我更喜欢第二个(信号量)因为它是最强大的&amp;最容易的。
是否发生了锁定或创建了多少个java实例?
除非您实施或使用synchronized
,否则不会发生任何默认锁定。