有沒有真正的方式來分配的CPU /內存時間的一定比例用於給定線程。你可以降低線程的優先級,因此不會飽和的所有資源:
int oldPriority = Thread.currentThread().getPriority();
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
// process your documents here
Thread.currentThread().setPriority(oldPriority);
一個更好的辦法,將可能讓你更接近指定百分比將使用一個ExecutorService
具有固定數量的線程和運行所有通過它處理文檔處理。如果您將服務器中的處理器數量減半,那麼它將有效地將文檔處理限制爲服務器CPU時間的50%。你想要一個單獨的服務,建立一個線程池這樣的:
int threads = Runtime.getRuntime().availableProcessors()/2;
ExecutorService service = Executors.newFixedThreadPool(threads);
然後在你的Web請求,你可以通過一個Callable
實現文檔處理服務和塊,直到它完成:
Callable<Result> callable = new DocumentProcessorCallable<Object>(doc);
Result result = service.submit(callable).get();
或者你可能更願意不阻止,並通過提供你傳遞給service.execute(runnable)
的Runnable
實現立即返回。有關更多示例和文檔,請參見ExecutorService。
+1與執行者解決方案一致,並提出警告。一旦開始使用執行程序服務進行資源管理,您就已經本地化了一個問題,這實際上是一個系統範圍的策略。爲了使這個可管理,你需要有一個策略,把你的執行者(和任何其他線程產生)放在一個地方來跟蹤它們。如果您在系統中的其他位置隨機添加/刪除線程,則會隱式更改全局資源分配決策。另一種方法可能是將JVM固定到單個/一個處理器子集。 – andersoj 2011-03-19 00:11:16
@andersoj:好點。 – WhiteFang34 2011-03-19 01:14:47