【问题标题】:Understanding multithread了解多线程
【发布时间】:2017-01-31 02:36:58
【问题描述】:

我对使用 Ant fork 方法的多线程进程有疑问

以下是 Jar 文件和相关的 java 类和方法

Test1.jar 有 --Test1.java 有 --方法A()

Test2.jar 有 --Test2.java 有 --方法B()

Test3.jar 有 --Test3.java 有 --方法C()

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

蚂蚁脚本:

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

【问题讨论】:

    标签: java multithreading ant ant-contrib


    【解决方案1】:

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

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

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

    另外,有没有办法我可以知道给定的执行了多少线程 一次方法?

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

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

    我更喜欢第二个(信号量),因为它最强大且最简单。

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

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

    【讨论】:

    • 1.是的 jar 是图书馆。我如何确认为每个 Test*.tsv 文件创建了单独的 java 实例,而不是在所有线程之间共享相同的实例 2。另外,假设 100 个线程尝试一次执行 MethodA() 在这种情况下会发生什么 99 个线程将等待直到第一个线程完成或线程 1 工作线程 2 也将进行更改并给出突然的结果感谢您的输入
    • (1) 如果您使用库而不创建全局对象,则它是独立的。我想你明白了我的意思。为了更清楚的答案,您可以输入您的代码吗?否则可能会产生误解。 :)) (2) 如果您实施了适当的锁定机制,就不会发生突然的结果。 .. 再次请将您的代码放在这里,以便我可以相应地回答,否则我所能做的就是提供通用 cmets。 :))
    • For1:我有多个 java 文件,所以无法发布所有代码。我只能说在java类中我有静态变量和方法,它们在其他类中被访问。有些类有线程等待时间所以,在这种情况下,即使线程 1 拾取 Test1.tsv 线程 2 拾取 Test2.tsv 线程 3 拾取具有给定 ant xml 配置的 Test3.tsv。仍然分离的实例创建了所有线程之间共享的静态方法类实例?全局对象是什么意思。
    • 对于 2:我的一般问题是假设有 100 个线程尝试在调用 Test1.java 中一次执行 MethodA() 在这种情况下会发生什么? 99 个线程将等到第一个线程完成或线程 1 工作线程 2 也会尝试进行更改?为了避免这种情况,我必须实现同步?
    • @gorants (1) 根据您的评论,我认为情况正好相反。所以这是同一个例子。你说你正在使用静态变量来共享资源,所以这就是我所说的全局。请参考更新的答案。 (2) 当您对整个方法使用同步时,您不能计算#threads。你可以用锁来做,或者使用信号量会很容易。请参考更新的答案。 :))
    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多