Android Executorsを使用することをお勧めします。これは、以前のものが実行されている間、あなたのスレッドを保持するいくつかのインターフェイスです。
たとえば、ユーザー10スレッドランナブル(AsyncTask)。しかし、あなたが理解すると、それは10スレッドを実行する - それは悪い考えです。だから、あなたは3つのスレッドだけのためのメモリスペースを作成し、デバイスのパフォーマンスを保存したい。だから最初の3つのスレッドを実行するインターフェイスを使用する必要があります!いくつかのスレッドが実行されると、あなたは次を実行するよりも。
更新! スレッド(10,100 ....)をすべて追加するだけで、エグゼキュータがメモリ内のすべてのタスクを正しく管理できます。もう一つのコンストラクタTheadPoolがあります。詳細については、ドキュメントを参照してください。乾杯!
例:
List<AsyncTask> listTask = new ArrayList<>();
....
//Add all your runnables interfaces
Executor ex = ThreadPoolExecutor.newFixedThreadPool(3);
//Number of active threads - 3
for (int i = 10; i < 10; i++) {
ex.execute(listTask.get(i));
}
もう一つの例: 正直なところ、AsyncTaskは、それがバックグラウンド作業のための最善の解決策ではありません。したがって、エグゼキュータはRunnableインターフェイスをサポートします。だからあなたは、JavaスレッドとRunnableのインターフェイスとアンドロイドExecutorsについて読む必要があり、毎回最良の解決策になるでしょう。使用Retrofit、RxJava、Volleyおよび他の実現。しかし、Javaのネイティブメソッドは、最も単純で安定しています。
最終更新日! this resource, to read moreにアクセスしてください。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SimpleThreadPool extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main)
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread(String.valueOf(i));
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated()) {
}
System.out.println('Finished all threads');
}
}
public class WorkerThread implements Runnable {
private String command;
public WorkerThread(String s){
this.command=s;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+' Start. Command = '+command);
processCommand();
System.out.println(Thread.currentThread().getName()+' End.');
}
private void processCommand() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String toString(){
return this.command;
}
}
結果前のコード。
pool-1-thread-2 Start. Command = 1
pool-1-thread-4 Start. Command = 3
pool-1-thread-1 Start. Command = 0
pool-1-thread-3 Start. Command = 2
pool-1-thread-5 Start. Command = 4
pool-1-thread-4 End.
pool-1-thread-5 End.
pool-1-thread-1 End.
pool-1-thread-3 End.
pool-1-thread-3 Start. Command = 8
pool-1-thread-2 End.
pool-1-thread-2 Start. Command = 9
pool-1-thread-1 Start. Command = 7
pool-1-thread-5 Start. Command = 6
pool-1-thread-4 Start. Command = 5
pool-1-thread-2 End.
pool-1-thread-4 End.
pool-1-thread-3 End.
pool-1-thread-5 End.
pool-1-thread-1 End.
Finished all threads
asynctaskの代わりにrunnableインターフェイスを使用して、使用できるjoinメソッドを使用することもできます。 –