了解多线程

时间:2017-01-31 02:36:59

标签: java multithreading ant ant-contrib

我对使用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元素的实现。所以我不确定多线程何时执行正在发生的事情。有时我看到很多延迟来完成方法执行,所以想知道是否有任何锁定发生。

1 个答案:

答案 0 :(得分:0)

根据您的描述,我有一些线程访问的共享全局资源。所以线程应该共享共享资源而不是分开的资源。

  

如果只创建了Test1.java,Test2.java和Test3.java的一个实例   当Thread1执行MethodA()时,Thread2必须等到Thread1   完成MethodA()执行?

是的,正确。但没人能保证订单。

  

另外,有没有办法可以知道执行的线程数量   方法一次?

是的,有几种方法可以做,

  • 您可以使用锁+另一个受保护的全局变量,该变量将在方法的开头递增。在方法结束时递减。 (旧方式 - 更明确)
  • 信号量 - 您可以使用getQueueLength()来实现此目的。 ( 最简单的方法 - 不太明确的实施)
  • A synchronized block

我更喜欢第二个(信号量)因为它是最强大的&amp;最容易的。

  

是否发生了锁定或创建了多少个java实例?

除非您实施或使用synchronized,否则不会发生任何默认锁定。