Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
Java 为了提高性能,可以选择Thread.sleep()?_Java_Spring_Multithreading_Algorithm_Spring Boot - Fatal编程技术网

Java 为了提高性能,可以选择Thread.sleep()?

Java 为了提高性能,可以选择Thread.sleep()?,java,spring,multithreading,algorithm,spring-boot,Java,Spring,Multithreading,Algorithm,Spring Boot,我在Spring Boot应用程序中执行一个函数,在REST请求中,我必须等待DB中的变量具有“x”值,然后将响应返回给客户端 我用Thread.sleep做了一段时间,但就性能而言,这是最好的方法吗 使用Thread.sleep进行编码: while(!peticionTmp.isRealizada()) { entityManager.clear(); peticionTmp = peticionesRepository.findById(peticio

我在Spring Boot应用程序中执行一个函数,在REST请求中,我必须等待DB中的变量具有“x”值,然后将响应返回给客户端

我用Thread.sleep做了一段时间,但就性能而言,这是最好的方法吗

使用Thread.sleep进行编码:

   while(!peticionTmp.isRealizada()) {
        entityManager.clear();
        peticionTmp = peticionesRepository.findById(peticion_id);
        Thread.sleep(3000);
        System.out.println("Iteración! --> " + peticionTmp);
    }
    
    return peticionTmp.isRealizada();
我看到了可以用这个做什么:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor ();
     scheduler.schedule (() -> {
         / *
          * define work to be done inside this lambda
          * /
     }, diffTime, TimeUnit.MILLISECONDS);
但我不知道如何在这段时间内实现它


客户端发送请求,spring boot应用程序将请求保存到DB,现在另一个程序在搜索请求时查看DB,创建包含请求的服务并更改该请求数据库中的一个字段,spring boot在看到该字段已更改时,我将响应返回给客户机…

正如其他人已经指出的那样,您手中的系统设计非常错误,因此很可能存在比性能更大的问题

现在,如果你真的必须改善你现有的大脑受损系统的性能,那么首先你需要定义性能

你的表演是什么?从客户的角度看响应时间?服务器上浪费的时钟周期数?可同时服务的客户端数

令人难以置信的长达3整秒的超时似乎表明您将性能视为浪费在服务器上的时钟周期。我们通常选择很长的轮询周期,因为我们希望大大减少轮询时间,从而减少每秒完成的工作量

但那可能不是你的本意。从客户端的角度来看,您可能关心的是响应时间,因为3秒的超时意味着客户端将始终等待至少3秒,当然是3秒的倍数。如果您想改进这一点,那么解决方案很简单:不使用Thread.sleep3000,而是使用Thread.sleep300甚至Thread.sleep30。现在,这将增加服务器上浪费的时钟周期数;那会是个问题吗?我们不知道,因为您还没有定义性能对您意味着什么。但我们知道的是,你不可能拥有一切:一个大脑受损的系统设计将不得不做出妥协

从评论中添加信息:

要解决这种情况,第一步是让服务器明确知道处理何时完成,而不是让服务器进行轮询来确定。这有两种方法:

让服务器代替外部应用程序进行处理。 让服务器启动一个外部应用程序来进行处理,并等待该应用程序终止,这样一旦外部应用程序终止,服务器就知道处理已经完成。 然后,就对客户的响应而言,您有许多备选方案:

服务器可以在工作完成时让请求等待,并在结束时返回结果。您目前正在使用Thread.Sleep完成这项工作,但正如我在上面所解释的,这需要消除,并用实际的处理来代替。如果处理必须由外部应用程序完成,则将替换为Process.WaitFor 服务器可以返回一个表示正在处理的结果,然后客户端可以继续调用相同或另一个API来轮询结果。 服务器可以利用spring boot的延迟结果。 如果客户端是web浏览器而不是REST客户端,那么您将有两个附加选项:

服务器可以返回一个结果,表示正在处理它,然后客户端可以使用Ajax接收工作已完成的通知。 服务器可以返回一个结果,表示正在处理它;请刷新页面以查看是否已准备就绪。
正如其他人已经指出的,您手中的系统设计非常错误,因此您很可能存在比性能更大的问题

现在,如果你真的必须改善你现有的大脑受损系统的性能,那么首先你需要定义性能

你的表演是什么?从客户的角度看响应时间?服务器上浪费的时钟周期数?可同时服务的客户端数

令人难以置信的长达3整秒的超时似乎表明您将性能视为浪费在服务器上的时钟周期。我们通常选择很长的轮询周期,因为我们希望大大减少轮询时间,从而减少每秒完成的工作量

但那可能不是你的本意。从客户端的角度来看,您可能关心的是响应时间,因为3秒的超时意味着客户端将始终等待至少3秒,当然是3秒的倍数。如果您想改进这一点,那么解决方案很简单:而不是Thread.sleep3000 do Thread.sle ep300,甚至是Thread.sleep30。现在,这将增加服务器上浪费的时钟周期数;那会是个问题吗?我们不知道,因为您还没有定义性能对您意味着什么。但我们知道的是,你不可能拥有一切:一个大脑受损的系统设计将不得不做出妥协

从评论中添加信息:

要解决这种情况,第一步是让服务器明确知道处理何时完成,而不是让服务器进行轮询来确定。这有两种方法:

让服务器代替外部应用程序进行处理。 让服务器启动一个外部应用程序来进行处理,并等待该应用程序终止,这样一旦外部应用程序终止,服务器就知道处理已经完成。 然后,就对客户的响应而言,您有许多备选方案:

服务器可以在工作完成时让请求等待,并在结束时返回结果。您目前正在使用Thread.Sleep完成这项工作,但正如我在上面所解释的,这需要消除,并用实际的处理来代替。如果处理必须由外部应用程序完成,则将替换为Process.WaitFor 服务器可以返回一个表示正在处理的结果,然后客户端可以继续调用相同或另一个API来轮询结果。 服务器可以利用spring boot的延迟结果。 如果客户端是web浏览器而不是REST客户端,那么您将有两个附加选项:

服务器可以返回一个结果,表示正在处理它,然后客户端可以使用Ajax接收工作已完成的通知。 服务器可以返回一个结果,表示正在处理它;请刷新页面以查看是否已准备就绪。
这似乎不是个好主意。。。谁在更改数据库?如果您确定数据库不会出现任何外部更改,您可以改为修改存储库,使其能够通知更改,即可观察,这样您就可以立即知道何时达到了所需的状态。我认为您的Thread.sleep方法是正确的。然而,总体设计似乎不正确。当结果在数据库中时,您最好使用回调,而不要让连接保持打开状态以等待结果。@ACV Spin wait通常被认为是一种反模式。虽然有时它无法避免,但你应该尽可能避免它。这似乎是一个可以避免的例子,但它需要一些实质性的努力。您应该在API上使用长轮询或实现客户端通知,例如通过WebSocket或使用HTPP2。在REST请求中阻塞是一个糟糕的想法。但是从性能方面来说,这是最好的方法吗。。。那是一种荒谬的说法。你担心什么样的表现?最好的总是主观的。例如,请注意,就CPU周期而言,您的第二个选项要重得多。而第一种解决方案的意思是:等待3秒钟。这可能太长了,所以理论上,这可能会增加一些用户的延迟。但我们不知道任何这样的细节。你知道的。所以,这里没有人能告诉你什么对你最好。这似乎不是个好主意。。。谁在更改数据库?如果您确定数据库不会出现任何外部更改,您可以改为修改存储库,使其能够通知更改,即可观察,这样您就可以立即知道何时达到了所需的状态。我认为您的Thread.sleep方法是正确的。然而,总体设计似乎不正确。当结果在数据库中时,您最好使用回调,而不要让连接保持打开状态以等待结果。@ACV Spin wait通常被认为是一种反模式。虽然有时它无法避免,但你应该尽可能避免它。这似乎是一个可以避免的例子,但它需要一些实质性的努力。您应该在API上使用长轮询或实现客户端通知,例如通过WebSocket或使用HTPP2。在REST请求中阻塞是一个糟糕的想法。但是从性能方面来说,这是最好的方法吗。。。那是一种荒谬的说法。你担心什么样的表现?最好的总是主观的。例如,请注意,就CPU周期而言,您的第二个选项要重得多。而第一种解决方案的意思是:等待3秒钟。这可能太长了,所以理论上,这可能会增加一些用户的延迟。但我们不知道任何这样的细节。你知道的。所以,这里没有人能告诉你什么对你最好。那么,这个系统还有什么替代方案呢?如果客户提出请求,他必须得到一个回应,告诉他是否进展顺利。请求可以持续几分钟,但这不是问题,因为要完成的服务很长,而且他们已经知道了。当然,当程序执行服务时,spring引导必须等待
查看数据库的程序响应,或者可能有其他替代方案。。。延迟结果?根据性能,我指的是服务器cpu、ram等的负载。替代方法是,首先不使用单独的程序执行服务,而是在需要时从服务器内部执行服务,启动一个外部程序,以便服务器知道程序一返回,任务就完成了。然后,就对客户机的响应而言,您有很多选择:a服务器可以在工作完成时让请求等待,并在最后返回结果,b服务器可以发送一个结果说正在处理它,然后使用Ajax通知客户机工作已经完成,或者c服务器可以提供一个页面,告诉我们正在处理它,刷新页面看看是否完成了。是的,Spring Boot的延迟结果也是一个很好的选择。但正如我在上面所写的,首先您必须让服务器明确知道处理何时完成,而不涉及任何类型的轮询。任何涉及投票的事情都不是好主意。总是这样。那么这个系统有什么替代方案呢?如果客户提出请求,他必须得到一个回应,告诉他是否进展顺利。请求可以持续几分钟,但这不是问题,因为要完成的服务很长,而且他们已经知道了。但当然,当程序执行服务时,spring引导必须等待程序查看DB的响应,或者可能还有另一种选择。。。延迟结果?根据性能,我指的是服务器cpu、ram等的负载。替代方法是,首先不使用单独的程序执行服务,而是在需要时从服务器内部执行服务,启动一个外部程序,以便服务器知道程序一返回,任务就完成了。然后,就对客户机的响应而言,您有很多选择:a服务器可以在工作完成时让请求等待,并在最后返回结果,b服务器可以发送一个结果说正在处理它,然后使用Ajax通知客户机工作已经完成,或者c服务器可以提供一个页面,告诉我们正在处理它,刷新页面看看是否完成了。是的,Spring Boot的延迟结果也是一个很好的选择。但正如我在上面所写的,首先您必须让服务器明确知道处理何时完成,而不涉及任何类型的轮询。任何涉及投票的事情都不是好主意。总是