2017-02-14 51 views
1

我是.NET開發人員,但我必須在Java中爲Android做一些代碼。我需要運行4個計算操作,並且我想在單獨的線程中完成。我可以簡單地創建4個線程並運行它,但是當設備的內核少於4個時(例如1),它將會像在一個線程中運行一樣,甚至更低效。在C#中我可以創建行動的清單,然後就這樣運行在Parrarel:Android的Java運行列表在單獨的線程類似於C#風格

C#代碼:

var actions = new List<Action> 
{ 
    () => { // some action1}, 
    () => { // some action2}, 
    () => { // some action3}, 
    () => { // some action4}, 
} 
Parallel.ForEach(actions, new ParallelOptions { MaxDegreeOfParallelism = GetCoreCount() }, x => x()); 

,這將運行,這將保證每一個行動將是獨立的核心流程(更多收起)

我可以在Android上使用Java來做這種事嗎?

我不知道該如何開始。

只有一件事情出現在我的腦海裏,就是這樣的一些,但這是醜陋而無效的。

int cores = Runtime.getRuntime().availableProcessors(); 
if(cores = 1) 
{ 
    // Create 1 Thread with action1,action2,action3,action4 
} 
if(cores = 2) 
{ 
    // Create 1 Thread with action1,action2 
    // And Create 2nd Thread with action3,action4 
} 
if(cores = 3) 
{ 
      // Create 1 Thread with action1, 
    // And Create 2nd Thread with action2 
    // And Create 3rd Thread with action3 
    // Thread that first end his action will pick up Action4 
} 
if(cores >= 4) 
{ 
        // Create 1 Thread with action1, 
    // And Create 2nd Thread with action2 
    // And Create 3nd Thread with action3 
    // And Create 4th Thread with action4 
} 

見甚至沒有codded這看起來非常不明確和骯髒的(什麼時候我加5行動?或將有8作用和8個核?)

我可以做類似C#的東西嗎?動作和並行執行列表受核心數限制嗎?

謝謝:)建議

回答

0

嘗試使用的ThreadPoolExecutor https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html

Java的處理效率問題你對擔心,並通知你一個核心/ CPU的計算機將有多個線程運行,只會有一個在任何時間運行。但任何現代計算機都有很多線程同時運行,它不依賴於有多少個核心/ cpus存在/可用。

+0

所以,如果我理解正確。即使當我創建比手機更多的線程將能夠處理它不會阻止和感謝threadPoolExecutor Android將能夠以最有效的方式控制Action的執行?我有4個動作,100%將阻止100%的每個CPU甚至在PC上 – Aht

+0

我不認爲它會讓你阻止100%,系統總是運行。線程總是被阻塞,也就是說我們如何能夠由同一個處理器或一組處理器運行這麼多,他們通常不會長時間阻塞,除非他們在等待或睡眠。 – SBC

相關問題