2017-02-14 3 views
1

私は.NET開発者ですが、JavaでAndroid用のコードをいくつか作成する必要があります。私は4演算演算を実行する必要があり、私は別のスレッドでそれをしたい。私は単純に4つのスレッドを作成して実行することができますが、デバイスが4つ未満のコア(たとえば1)を持つ場合、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でこれを行うことはできますか?

これをどのように開始するかわかりません。

私の頭に来るのは、このようなものが1つだけですが、これは醜い効果がありません。

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

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html

Javaは効率を約あなたの心配を発行扱うthreadPoolExecutorを使用してみてください、とだけあるでしょうFYI 1つのコア/ CPUを搭載したコンピュータは、複数のスレッドが実行されています任意の時点で実行されています。しかし現代のコンピュータでは、同時に多くのスレッドが実行されていますが、コア/ CPUの数/使用可能数には依存しません。

+0

私は正しく理解しています。私は携帯電話より多くのスレッドを作成してもブロックすることはできませんし、threadPoolExecutorのおかげでAndroidは最も効率的な方法でアクションの実行を制御することができるでしょうか?私は4つのアクションを持っているので、100%はPC上でも各CPUの100%をブロックするでしょう。 – Aht

+0

私は100%ブロックすると思いません。システムは常に動作しています。そして、スレッドは常にブロックされているので、同じプロセッサやプロセッサセットで実行されることが多いので、待機したりスリープしたりしない限り、通常はブロックされません。 – SBC

関連する問題