Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在AppEngine标准环境中使用java创建线程_Java_Multithreading_Google App Engine_Task Queue - Fatal编程技术网

在AppEngine标准环境中使用java创建线程

在AppEngine标准环境中使用java创建线程,java,multithreading,google-app-engine,task-queue,Java,Multithreading,Google App Engine,Task Queue,我是谷歌云平台的新手。我使用的是AppEngine标准环境。我需要用java创建线程,但我认为这是不可能的,是吗 情况如下: 我需要为用户创建提要 有三个数据库的名称分别为d1、d2、d3 每当用户发送feed请求时,Java就会创建三个线程,每个数据库一个线程。例如,d1为t1,d2为t2,d3为t3。为了获得更好的性能,这些线程必须异步运行,然后将来自这3个线程的数据合并并在响应中发送回用户 我知道如何为此编写代码,但正如您所知,我需要线程来完成这项工作。如果符合标准环境。不允许那么我该怎么

我是谷歌云平台的新手。我使用的是AppEngine标准环境。我需要用java创建线程,但我认为这是不可能的,是吗

情况如下:

我需要为用户创建提要

有三个数据库的名称分别为
d1、d2、d3

每当用户发送feed请求时,Java就会创建三个线程,每个数据库一个线程。例如,d1为t1,d2为t2,d3为t3。为了获得更好的性能,这些线程必须异步运行,然后将来自这3个线程的数据合并并在响应中发送回用户

我知道如何为此编写代码,但正如您所知,我需要线程来完成这项工作。如果符合标准环境。不允许那么我该怎么办?还有别的办法吗

在GCP文件中,他们说:

<>为了避免使用线程,请考虑任务队列

我读过关于任务队列的文章。有两种类型的队列:推式队列和拉式队列。两者都异步运行,但不向用户发送响应。我认为它们只是为了在后台完成任务而设计的


你能告诉我怎样才能实现我的目标吗?对此我需要学习什么?

注意:答案完全基于文档,我不是java用户

标准环境支持线程,但有限制。发件人:

注意:线程是一种功能强大的功能,充满了惊喜。要了解有关在Java中使用线程的更多信息,我们建议 Goetz,《实践中的Java并发性》

Java应用程序可以创建新线程,但有一些 如何做的限制。这些线程不能“活过”该线程 创建它们的请求

应用程序可以

  • 实现
    java.lang.Runnable
  • 通过调用
    com.google.appengine.api.ThreadManager.currentRequestThreadFactory()
    创建线程工厂
  • 调用工厂的
    newRequestThread
    方法,传入
    Runnable
    newRequestThread(Runnable)
    ,或使用工厂对象 退回 使用
    执行器服务
    (例如,呼叫
    Executors.newCachedThreadPool(工厂)
但是,必须使用
ThreadManager
上的方法之一创建 你的线程。您不能自己调用
new Thread()
或使用

应用程序可以对当前线程执行操作,例如 作为
thread.interrupt()

每个请求限制为50个并发请求线程。爪哇 如果您尝试,运行时将抛出
java.lang.IllegalStateException
在一个请求中创建50多个线程

使用线程时,请使用,例如
Executor
Runnable
。它们处理了许多微妙但复杂的问题 并发的重要细节,如和


实现所需功能的一种优雅方法是在应用程序中创建一个可参数化的端点

/runFeed?db=d1
您可以从“主”应用程序代码执行
fetchAsync
调用,该调用将返回
java.util.concurrent.Future

这将允许您更好地监视应用程序的功能。
这将增加应用程序的网络延迟,并增加其成本,因为urlFetchService不是免费的

我想再问一件事,当您从云SQL获取数据时,多线程是否会提高性能?我读过很多关于java中多线程性能的问题,但我认为这里的情况是变化,我从云sql中获取数据,这是另一种机制,我认为云sql能够并行处理3个数据库的3个请求,因此,通过线程化并行数据库操作,用户请求应该能够获得更快的响应时间;Thread Thread=threadFactory.newThread(new Runnable(){public void run(){/*CODE*/}});thread.start();