我有一个奇怪的问题,我正在尝试使用以下代码创建一个使用线程实现tick更新系统的程序:
library(shiny)
require(forecast)
name = c(2,4,3,8,6,12,4,16)
name <- ts(name, frequency=12, start=c(2007,1))
ui <- fluidPage(
numericInput(inputId = "n2", "Size of training set", value = 12),
radioButtons(inputId = "n3", "Forecast type", c("Holt Winter's" = "HW", "ARIMA" = "arima")),
plotOutput(outputId = "graph"),
plotOutput(outputId = "graph2")
)
server <- function(input, output) {
output$graph <- renderPlot({
plot(name, type = "l")
})
output$graph2 <- renderPlot({
if (input$n3 == "HW") {
fit <- ets (name, model = "ZAZ", damped=TRUE)
plot(forecast(fit,level=c(80,80,99), h = input$n2), main = "Forecast, HW")
}
if (input$n3 == "arima") {
fit <- auto.arima (name)
plot(forecast(fit, 12), main = "Forecast, ARIMA")
}
})
}
shinyApp(ui = ui, server = server)
这样可以正常工作,除了事实上,在完全停止运行161次后,它不会抛出任何东西,没有异常,没有错误,什么也没有。 然而,只要我执行以下操作:
@Override
public void run(){
long lastTime = System.nanoTime();
long deltaTime;
float passedTime = 0;
long ticks = 0;
while(true){
long currentTime = System.nanoTime();
deltaTime = currentTime - lastTime;
lastTime = currentTime;
passedTime += deltaTime / tickTime;
if(passedTime * 20 > ticks){
ticks++;
tick();
System.out.println(ticks);
}
}
}
现在突然它运行没有问题?
有没有人知道这可能是什么原因?提前谢谢!
答案 0 :(得分:2)
添加一个print语句的原因修复了iussue是因为你在旋转。
如果一个线程在没有阻塞/ io / other的情况下执行紧密循环,它只会旋转并占用cpu,导致所有其他礼貌线程获得更少的资源。
要解决此问题(作为临时措施),您可以添加Thread.sleep(0)
,这将释放其他线程的CPU以获得CPU时间。
一个更永久的解决方案应该是将一些机制放在一起进行流程之间的通信(可能是BlockingQueue
),这样你的线程就会花费大部分时间等待/阻塞。