1

我有一個客戶端應用程序,其中runnable必須在修復期運行。因此,我使用java.util.concurrent.ScheduledExecutorService如下:java.util.concurrent.ScheduledExecutorService運行非常不頻繁

ScheduledExecutorService scheduledExecutorService = 
      Executors.newScheduledThreadPool(10); 

ScheduledFuture scheduledFuture = 
      scheduledExecutorService.scheduleAtFixedRate(runnableClass, 
      period,period,TimeUnit.SECONDS); 

只要工作量爲低時,任務被調度在定義的時間段,即,如果客戶端從服務器接收任何消息。但是,如果服務器以全速度拍攝消息,則不會按時執行runnableClass.run()。我覺得執行之間的時間呈指數級增長。但電腦仍然運行平穩。

所有Exceptions都在run()之內,如果我減少了從服務器發送的消息,則會更頻繁地調度該任務。

爲什麼會發生這種情況?

編輯:任務需要大量的資源,它使用Rserve獲得在R計算出的預測。在一項任務中,可能多達5000個呼叫R

我做了一些關於任務時間的測試。任務總是在一秒之內完成,而時間在3到20秒之間。

+0

您能詳細描述一下計劃任務的特點嗎? CPU或I/O綁定?共同資源?平均執行時間? – laune

+0

那麼有多少Rserve服務器?這看起來像一個資源給我,你可能會爭論。並行比Rserve服務器多的線程是沒有意義的。 - 另外我現在在我的頭盔上有什麼「全速」的意思,但是每分鐘有多少請求是在你的速度計上?以固定速率進行調度不是處理許多任務的最佳答案,它可能會避免同步問題。我不想苛刻,但是你有沒有徹底檢查過你的設計? – laune

+0

消息的處理不與任務耦合,該任務應該以固定速率運行。這個想法是使用固定費率任務來批量處理傳入消息流。因此收集消息的相關信息並以固定的速率處理。否則,儘管要使用批處理。 – 7morgen

回答

0

你有多少個線程在運行,你有多少個核心?是否會發生這樣的情況:您爲來自不同線程的每個請求提供服務,並且上下文切換會使您的應用程序運行得越來越慢?

注意不要有比核心更多的CPU綁定線程。 (只是一個猜測,對不起,如果它的方式關閉)

另外,你需要一個計劃的線程池執行器智慧核心大小爲10? SingleThreadScheduledExecutor是否足夠用於計劃任務?

+0

問題不是答案!將此移至評論。 – laune

+0

我很樂意做到這一點,但當我最後一次嘗試50聲望是評論問題的最低限度;-) – TamasGyorfi

+0

小心:這樣的答案通常是downvoted,這將減少你的代表甚至更多。 - 通常的建議是耐心並收集積分,直到您可以發表評論。 – laune