" HandshakeCompleteNotify"线程导致程序停止

时间:2014-12-18 09:38:12

标签: java multithreading hang

所以,我遇到了一个奇怪的问题,我真的陷入困境。我有一个漫长的过程(加载1000万+记录到salesforce)。当我运行这个过程时,一切顺利,直到结束。

在此过程结束时,我等待salesforce确认所有记录已成功加载。

有时(并非总是,但大部分时间),程序似乎停滞不前。如果我暂停调试器,它不会提取任何代码行,我也无法使用"步骤"功能。虽然它停滞不前,但一条线程的闪烁速度比我能读到的要快。我设法通过屏幕快速拍摄我的桌面来捕获它。

enter image description here

关于如何解决这个问题的任何建议?洞察为什么会发生这种情况?我有点不在我的舒适区。

更新

事实证明,经过很长一段时间后,它终于按预期返回了。似乎线程正在做某种工作,但可能没有得到公平的资源份额?仍然不知道它为什么会发生。也许这与我在循环中进行的 thread.sleep()调用有关?

这基本上是有问题的代码。它来自this resource put out by salesforce

/**
 * Wait for a job to complete by polling the Bulk API.
 * 
 * @param connection
 *            BulkConnection used to check results.
 * @param job
 *            The job awaiting completion.
 * @param batchInfoList
 *            List of batches for this job.
 * @throws AsyncApiException
 */
private void awaitCompletion(BulkConnection connection, JobInfo job,
      List<BatchInfo> batchInfoList)
        throws AsyncApiException {
    long sleepTime = 0L;
    Set<String> incomplete = new HashSet<String>();
    for (BatchInfo bi : batchInfoList) {
        incomplete.add(bi.getId());
    }
    while (!incomplete.isEmpty()) {
        try {
            Thread.sleep(sleepTime);
        } catch (InterruptedException e) {}
        System.out.println("Awaiting results..." + incomplete.size());
        sleepTime = 10000L;
        BatchInfo[] statusList =
          connection.getBatchInfoList(job.getId()).getBatchInfo();
        for (BatchInfo b : statusList) {
            if (b.getState() == BatchStateEnum.Completed
              || b.getState() == BatchStateEnum.Failed) {
                if (incomplete.remove(b.getId())) {
                    System.out.println("BATCH STATUS:\n" + b);
                }
            }
        }
    }
}

0 个答案:

没有答案