Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Multithreading 在Java中的RESTful Web服务上使用线程_Multithreading_Web Services_Rest_Web - Fatal编程技术网

Multithreading 在Java中的RESTful Web服务上使用线程

Multithreading 在Java中的RESTful Web服务上使用线程,multithreading,web-services,rest,web,Multithreading,Web Services,Rest,Web,我有一个RESTful Web服务的问题,我有一个php客户端,它调用Java中的RESTful服务。在我的RESTful服务中,我有一个Post方法,它执行更新查询来修改一个包含10000条记录的表中的所有行。我想用线程来做这件事。有可能做到吗?。请帮帮我,我是Java的新手。谢谢 好的,我正在我的服务层中执行此操作: for(int i = 0; i < 10; i++) { startRow = i*1000; finalRow = i*1000 + 1000;

我有一个RESTful Web服务的问题,我有一个php客户端,它调用Java中的RESTful服务。在我的RESTful服务中,我有一个Post方法,它执行更新查询来修改一个包含10000条记录的表中的所有行。我想用线程来做这件事。有可能做到吗?。请帮帮我,我是Java的新手。谢谢

好的,我正在我的服务层中执行此操作:

for(int i = 0; i < 10; i++)
{
    startRow = i*1000;
    finalRow = i*1000 + 1000;
    Runnable process = new ProcessRecords(startRow , finalRow);
    executor.execute(process);                    
}

// Wait until all threads are finish
while (!executor.isTerminated()) {

}
System.out.println("\n All threads finished");
然后在我的数据层中,我在我的方法“averangeGrade”中这样做:

然后,当我执行我的客户机时,我的服务会对最上面的行进行更新,比如50行,然后返回消息,比如如果所有进程都完成了,我不知道为什么。我想不是等到所有的线程都完成了,但是有代码,那么为什么会发生这种情况呢?。请帮帮我。谢谢。

当然可以。 您熟悉Java提供的并发API吗

从高层次的角度来看,您必须编写处理Http POST的代码。在这段代码中,您可以实例化任意数量的线程(线程池),池中的每个线程对要更新的行的子集进行更新。 例如,您可以启动10个线程,每个线程仅对1000行进行更新

此外:

  • 我会在应用程序启动时设置线程池,因此每次执行POST时,它都会使用已经创建的池,并且不会每次都实例化一个新的线程池(这太昂贵了)
  • 要将行的子集分配给每个线程,必须使用LIMIT和START sql子句来选择子集。基于这两个参数,每个线程将有一个不同的查询
  • 代码:

    // instantiate the pool
    ExecutorService pool=Executors.newFixedThreadPool(poolSize);
    // run the task to execute in parallel, specificying the subset of rows
    pool.execute(new UpdateHandler(limit,skip));
    
    // below you find a prototype of the async thread task
    class Handler implements Runnable {
       private final int skip;
       private final int limit;
       Handler(int limit, int skip) { ... }
    
       public void run() {
         // specify the code that runs the query here
       }
     }
    
    您可以找到文档或 希望这有帮助。

    当然,这是可能的。 您熟悉Java提供的并发API吗

    从高层次的角度来看,您必须编写处理Http POST的代码。在这段代码中,您可以实例化任意数量的线程(线程池),池中的每个线程对要更新的行的子集进行更新。 例如,您可以启动10个线程,每个线程仅对1000行进行更新

    此外:

  • 我会在应用程序启动时设置线程池,因此每次执行POST时,它都会使用已经创建的池,并且不会每次都实例化一个新的线程池(这太昂贵了)
  • 要将行的子集分配给每个线程,必须使用LIMIT和START sql子句来选择子集。基于这两个参数,每个线程将有一个不同的查询
  • 代码:

    // instantiate the pool
    ExecutorService pool=Executors.newFixedThreadPool(poolSize);
    // run the task to execute in parallel, specificying the subset of rows
    pool.execute(new UpdateHandler(limit,skip));
    
    // below you find a prototype of the async thread task
    class Handler implements Runnable {
       private final int skip;
       private final int limit;
       Handler(int limit, int skip) { ... }
    
       public void run() {
         // specify the code that runs the query here
       }
     }
    
    您可以找到文档或
    希望这能有所帮助。

    你能说得更具体一点吗:(1)你所说的“使用线程”到底是什么意思?(2) 你想解决什么问题?仅仅使用线程并不能提高数据库的速度。如果RESTful调用正在更新表中的每一行,那么您可能应该重新组织数据,以便表引用只需要更新一次的外来值。我相信您可能正在寻找执行异步工作来执行这个大型更新。请您澄清一下,以便我们更好地理解您的问题。您需要通过包含代码来展示您迄今为止的研究和尝试。对你当前问题的任何回答只会让你提出更多的问题。我在问题中提供了更多的信息。谢谢大家。你能更具体一点吗:(1)你说的“使用线程”到底是什么意思?(2) 你想解决什么问题?仅仅使用线程并不能提高数据库的速度。如果RESTful调用正在更新表中的每一行,那么您可能应该重新组织数据,以便表引用只需要更新一次的外来值。我相信您可能正在寻找执行异步工作来执行这个大型更新。请您澄清一下,以便我们更好地理解您的问题。您需要通过包含代码来展示您迄今为止的研究和尝试。对你当前问题的任何回答只会让你提出更多的问题。我在问题中提供了更多的信息。谢谢大家。是的,这很有用。谢谢你,但我仍然没有结果,因为我正在工作,但只是第一排,我不知道为什么。我在问题中提供了更多的信息。也许这会有帮助。谢谢。@ErickRodriguezAvarez正如您所发布的,在等待每个线程结束之前,您正在运行线程池关闭。您应该在所有线程完成其工作后运行它。是的,谢谢,您完全正确,但是当我执行线程时,即使我的线程支持完成,while循环也不会完成。你认为为什么会发生这种情况?哪种情况?在条件为isTerminated()的线程或while中?是的,这很有用。谢谢你,但我仍然没有结果,因为我正在工作,但只是第一排,我不知道为什么。我在问题中提供了更多的信息。也许这会有帮助。谢谢。@ErickRodriguezAvarez正如您所发布的,在等待每个线程结束之前,您正在运行线程池关闭。您应该在所有线程完成其工作后运行它。是的,谢谢,您完全正确,但是当我执行线程时,即使我的线程支持完成,while循环也不会完成。你认为为什么会发生这种情况?哪种情况?在条件为isTerminated()的线程或while中?
    // instantiate the pool
    ExecutorService pool=Executors.newFixedThreadPool(poolSize);
    // run the task to execute in parallel, specificying the subset of rows
    pool.execute(new UpdateHandler(limit,skip));
    
    // below you find a prototype of the async thread task
    class Handler implements Runnable {
       private final int skip;
       private final int limit;
       Handler(int limit, int skip) { ... }
    
       public void run() {
         // specify the code that runs the query here
       }
     }