0

大量の ID (約 10 万から 100 万) に対して計算/処理を行う必要があります。ID の数が非常に多く、各処理に時間がかかるため、Java コードにスレッドを実装することを考えていました。

一度に 100K のスレッドを実行できないと仮定すると、この場合、スレッド化をどのように実装すればよいでしょうか?

注 - 私が考えることができる唯一の解決策は、各スレッドが約 1000 以上の ID を処理する約 100 以上のスレッドを実行することです。

4

4 に答える 4

3

スレッドプールの使用:

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();
    }
}
于 2013-09-18T16:13:19.837 に答える