当前位置: 首页 > 知识库问答 >
问题:

线程被多次调用

侯英达
2023-03-14

我有一个代码,在那里我处理多个线程。一个线程等待它所依赖的其他一些线程的执行。

线程的运行代码如下所示

    public void run() {

    for ( final String name : nameList ) {
      final Thread thread = getThreadByName( name );
      if ( thread != null ) {
          while ( thread.isAlive() ) {
              thread.join();
          }
      }
    }
    //perform action
}

很少有其他线程等待这个线程在相同的方法中完成执行,如图所示,通过调用join()来执行run()。

假设这个线程依赖于另外三个线程,它正在等待它们在thread.join()中完成执行。即nameList大小为3,但此线程也执行了3次操作。它在for循环的外部。

我用另一种方法启动这个线程,比如

    switch ( element.getKey() ) {
        case A
           thread = new Thread( action );
           thread.setName( threadName );
           thread.start();
         break;

由于某种原因(我无法理解),线程运行了三次。

它是只在我调用thread.start()方法时运行还是在其他线程正在等待thread.join()方法中的这个线程时它必须做些什么?当这个线程在thread.join()中等待时,它不应该执行进一步的操作,对吗?

更新:

对不起,有一个不清楚的问题:运行后有一个打印语句()

run()//打印For循环

则在//perform action中有另一个print语句//print B

A和B均打印3次。对于数字3,我唯一想到的是因为nameList大小是3。

共有1个答案

郁光熙
2023-03-14

猜谜:你把那张支票

if ( thread != null ) {
  while ( thread.isAlive() ) {
    thread.join();
  }
}

进入你的代码;可能是有原因的。如果该调用实际返回null,则跳出for循环;然后运行以下操作。

所以,万一检查真的有意义;当thread为null时,必须防止离开该循环级别。

 类似资料:
  • 我试图为BillingClient v.2.2.0和Kotlin协同程序编写一个包装: 正如您所见,当我试图查询购买或购买时,我确保客户已经准备好。但在生产中存在许多错误: 我试图了解问题的原因,得到了if将被多次调用。可能存在异常。我一直想知道这是怎么可能的,因为我每次调用都会创建新的侦听器?我无法在emulator或测试设备上重现此问题。有人能解释一下这里发生了什么,以及如何解决吗?

  • 我正在尝试在像这样: 然后在我的它呈现: 我正在将我的fetch记录到控制台中,它被调用了三次。流程是我在登录页面上(加载时挂载一次),我登录,它将我重定向到自己呈现的主页。此时,我在控制台中看到:

  • 我在我的应用程序中实现GCM。我已经按照GCM教程中给出的所有步骤从developer.android.com 我能够成功地从GCM获得注册ID,并且我正在将此ID传递给我的应用程序服务器。因此,成功地执行了注册步骤。 现在,当我的应用服务器向我的设备发送PUSH消息时,服务器将获得SUCCESS=8 FAILURE=0等消息,即:服务器成功发送消息,但OnMessage被调用8次取决于成功值。

  • 问题内容: 我知道关于“多次调用getView”的问题很少,但是我的问题没什么不同。 我有一个带有自定义行的自定义listView(使用row_layout.xml)。通常效果很好。最初,我多次调用getView时遇到问题,并使用在stackoverflow中看到的一种方法解决了该问题。(使用’usedPositions’数组)。 现在,我在日志中看到这种情况:getView pos 0,getV

  • 我有一个,它有一个字段,如下所示 我还有几个,它们是继承的的部分。 在其中一个如果这些片断中,我将在片断的方法中进行另一个调用,如下所示 当第一次创建片段时,只调用一次,但片段会转到后台,然后返回,它会被多次调用,这会引起问题。 如有任何帮助,我们将不胜感激。

  • 问题内容: 我有以下结构: 该方法 可以 被许多线程同时调用。该 会 抛出异常(它在后台,可能成为过时的使用一些数据)。 如果引发异常,则执行一些耗时的任务,比如说“更新”所有当前数据,并且我可以调用。 问题: 如何确保只调用 一次 ?如果我在的条目中放置了原子标志,则不能确定何时清除该标志。 我该如何解决?请注意:由于它是一个外部API,因此我无法修改,并且我正在使用装饰器模式来使用它。 问题答