2014-08-31 49 views
1

我正在創建一個Java服務器應用程序。如果應用程序在可能的情況下運行,它將會佔用大量資源。在tick中循環一個java應用程序

據我知道,如果我加了sleep方法,它會像這樣運行:

Do task (Might take 10ms to do. Can also take longer or less) 
Sleep 50ms 
Do task (Might take 10ms to do. Can also take longer or less) 
Sleep 50ms 

那麼,如何可以使它運行每隔50ms(20打勾)?

感謝

+0

你能澄清一下你真正想要什麼以及它與你的睡眠方法有什麼不同嗎? – 2014-08-31 18:16:47

+0

立即嘗試。 @SotiriosDelimanolis – user3854743 2014-08-31 18:20:04

+0

你是說你希望下一次迭代每50ms運行一次,不管前一個任務花了多長時間? – 2014-08-31 18:20:37

回答

0

不知道你的應用程序做什麼(你可以在你的問題已經包括了它),你可以使用一個調度器(Quartzjava.util.Timer)。你每50ms試圖執行哪項任務?

編輯:

雖然「遊戲圈」是一個好遊戲好,服務器很少有他們。接收數據是一個連續的行爲,並且狀態應該相應地改變。這是服務器中的一個更大的設計問題。通過適當的設計,您不需要創建人爲停頓。

例如,一個簡單的設計就是讓線程等待接收來自客戶端的輸入,並且當接收到消息時,它會被處理,並向所有客戶端發送消息以通知更改。沒有繁忙的等待,除非有來自客戶的消息,否則什麼都不會發生。

+2

這是一個答案或評論??? – laune 2014-08-31 18:12:40

+0

其遊戲服務器平臺。所以基本上每個滴答。接收數據,發送數據,計算位置等。 – user3854743 2014-08-31 18:13:20

+1

朦朧導致不準確。 – laune 2014-08-31 18:15:07

0

您可以使用ScheduledExecutorService

ScheduledExecutorService service = Executors.newScheduledThreadPool(10); 
service.scheduleAtFixedRate(() -> { 
    System.out.println("whatever"); 
}, 0, 50, TimeUnit.MILLISECONDS); 
    //^rate 

scheduledAtFixedRate()方法將安排執行給定的任務以固定利率,無論任務需要的時間。你可能有一個執行時間超過50毫秒,並且下一個仍然會運行(假設你有足夠的線程)。

+0

我希望它每秒運行20次。如果服務器超載,它會嘗試每秒運行20次。 – user3854743 2014-08-31 18:33:52

+0

@ user3854743它會的,是的。 – 2014-08-31 18:40:42

相關問題