大量の ID (約 10 万から 100 万) に対して計算/処理を行う必要があります。ID の数が非常に多く、各処理に時間がかかるため、Java コードにスレッドを実装することを考えていました。
一度に 100K のスレッドを実行できないと仮定すると、この場合、スレッド化をどのように実装すればよいでしょうか?
注 - 私が考えることができる唯一の解決策は、各スレッドが約 1000 以上の ID を処理する約 100 以上のスレッドを実行することです。
大量の ID (約 10 万から 100 万) に対して計算/処理を行う必要があります。ID の数が非常に多く、各処理に時間がかかるため、Java コードにスレッドを実装することを考えていました。
一度に 100K のスレッドを実行できないと仮定すると、この場合、スレッド化をどのように実装すればよいでしょうか?
注 - 私が考えることができる唯一の解決策は、各スレッドが約 1000 以上の ID を処理する約 100 以上のスレッドを実行することです。
スレッドプールの使用:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ThreadIDS implements Runnable
{
public static final int totalIDS = 1000000;
int start;
int range;
public ThreadIDS(int start, int range)
{
this.start=start;
this.range=range;
}
public static void main(String[] args)
{
int availableProcessors = Runtime.getRuntime().availableProcessors();
int eachThread = totalIDS/availableProcessors + 1;
ExecutorService threads = Executors.newFixedThreadPool(availableProcessors);
for(int i = 0 ; i < availableProcessors ; i++)
{
threads.submit(new ThreadIDS(i*eachThread, eachThread));
}
while(!threads.awaitTermination(1000, TimeUnit.MILLISECONDS))System.out.println("Waiting for threads to finish");
}
public void processID(int id)
{
}
public void run()
{
for(int i = start ; i < Math.min(start+range, totalIDS) ; i++)
{
processID(i);
}
}
}
実行方法を編集しました。整数除算で ID が失われるのを避けるために、除算時に 1 を追加するため、totalIDS の制限を超える可能性があります。Math.min はそれを回避します。
ThreadPools を使用したくない場合は、main を次のように変更します。
public static void main(String[] args)
{
int availableProcessors = Runtime.getRuntime().availableProcessors();
int eachThread = totalIDS/availableProcessors + 1;
for(int i = 0 ; i < availableProcessors ; i++)
{
new Thread(new ThreadIDS(i * eachThread, eachThread)).start();
}
}