Multithreading GAE线程池速度不一致

Multithreading GAE线程池速度不一致,multithreading,google-app-engine,threadpool,java-7,Multithreading,Google App Engine,Threadpool,Java 7,我正在谷歌应用程序引擎上设置一项服务。我需要该服务拨打五个外部服务电话,合并他们的结果,并返回合并后的答案。外部服务是我无法控制的 我设置了一个线程池,如下所示: import com.google.appengine.api.ThreadManager; import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent

我正在谷歌应用程序引擎上设置一项服务。我需要该服务拨打五个外部服务电话,合并他们的结果,并返回合并后的答案。外部服务是我无法控制的

我设置了一个线程池,如下所示:

import com.google.appengine.api.ThreadManager;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;

// ...

Executor executor = new ThreadPoolExecutor(3,
    10,
    30,
    TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(50),
    ThreadManager.currentRequestThreadFactory());
    // I looked into the backgroundThreadFactory(), but that would only
    // work with a backend service, which is deprecated.

// ...

Collection<Result> doWork(List<Task> tasks) {
  final ResultCollector collector = new ResultCollector(); // My own class to join results.
  final CountDownLatch latch = new CountDownLatch(tasks.size());
  for (Task task : tasks) { // My own worker class
    executor.execute(new Runnable() {
      @Override
      public void run() {
        task.execute(collector); // Does work, populates collector.
        latch.countDown();
      }
    });
  }

  latch.await();
  return collector.getResult();
}
import com.google.appengine.api.ThreadManager;
导入java.util.concurrent.CountDownLatch;
导入java.util.concurrent.LinkedBlockingQueue;
导入java.util.concurrent.ThreadPoolExecutor;
// ...
Executor Executor=新线程池Executor(3,
10,
30,
时间单位:秒,
新的LinkedBlockingQueue(50),
currentRequestThreadFactory());
//我查看了背景ThreadFactory(),但那只会
//使用不推荐使用的后端服务。
// ...
收集工作(列出任务){
final ResultCollector collector=new ResultCollector();//我自己的类来连接结果。
final CountDownLatch latch=新的CountDownLatch(tasks.size());
for(Task:tasks){//我自己的工人类
executor.execute(新的Runnable(){
@凌驾
公开募捐{
task.execute(收集器);//执行,填充收集器。
倒计时();
}
});
}
satch.wait();
返回collector.getResult();
}
然后我的服务电话开始不时超时。我输入了一些日志,发现在某些情况下,
Runnable
run()
调用在10秒或更长的时间内没有被调用。我不确定这是否是因为appengine正在为每个请求创建一个新的线程池。正如我在评论中所说,我不能使用
backgroundThreadFactory
,因为它不是后端实例

在AppEngine中,有没有一种更高效的方法来并行进行这些调用