2011-10-23 34 views
3

我想控制每個線程使用的時間量。是否可以控制每個線程在Java中執行的時間量?

一個線程執行一些處理,另一個線程處理數據庫中的數據,但由於生成的數據量太大,插入比處理慢。我想給更多的處理器時間來插入數據。

是否有可能用線程做到這一點?目前,我正在進行處理的線程中休眠,但插入的時間根據機器而改變。有另一種方法可以做到這一點嗎?涉及到在我的程序中使用線程同步的方式?

回答

2

首先要提的是線程優先級本身並不意味着「CPU的份額」。似乎有很多關於線程優先級實際上意味着什麼的困惑,部分是因爲它實際上在不同的操作系統下意味着不同的東西。如果你在Linux工作,它實際上意味着接近於CPU的相對份額。但在Windows下,它絕對不會。因此,如果有任何幫助,您可能首先需要查看我剛纔編譯的一些關於thread priorities in Java的信息,這些信息解釋了線程優先級在不同系統上的實際意義。

你的問題的一般答案是,如果你想要一個線程獲得一個特定的CPU份額,最好是以編程方式隱式做到這一點:週期性地,對於每個「塊」處理,測量經過了多少時間使用了多少CPU--它們並不嚴格地說同一件事),然後睡一段適當的時間,以便處理/睡眠比大致達到你想要的處理時間的百分比。

但是,我不確定這會真正幫助您完成任務。

據我所知,基本上你有一個插入任務,這是速率確定步驟。在一般情況下,系統不太可能「故意將CPU佔用的CPU少於或可能需要」投入運行該插入的線程。

因此,在查看插入任務時可能會有更多的里程數,並且如果以編程方式查看可以更改插入任務的功能如何。例如:你可以插入大批量的產品嗎?如果插入過程由於某種原因確實是CPU綁定的(我懷疑它),你可以多線程嗎?爲什麼你的應用程序真的關心等待插入完成,你能改變依賴關係嗎?

如果插入到一個標準的數據庫系統,我不知道這個插入是否非常受CPU限制?

2

一種方法是將處理線程的優先級設置爲低於另一個。但要小心這不是建議,因爲它不會保持你的代碼平臺獨立。 (不同的線程優先級在不同的平臺上表現不同)。

另一種方式是使用一個服務,其中數據庫線程將不斷髮送有關其當前狀態的消息(可能是某個標誌「aboutToOver」)。

或使用同步說一個二進制信號量。當數據庫線程正在工作時,另一個線程將被阻塞,因此db線程將使用所有資源。但是再次處理線程會同時被阻塞。實際上,這將是最好的解決方案,因爲處理線程可以執行3-4個任務,然後將被信號量阻塞,直到它可以再次起牀並且執行任務

4

您可以使用Thread.setPriority(...)來增加線程的優先級但這並不理想。

也許你可以使用某種形式的blocking queue from the java.util.concurrent package來使一個線程等待,而另一個線程正在做某事。例如,可以使用SynchronousQueue將消息從一個線程發送到另一個線程,以便現在可以執行某些操作。

另一種方法是使用Runnables而不是線程,並將Runnables提交給Executor,如ThreadPoolExecutor。該執行者將負責確保Runnables使用相當長的時間。

相關問題