1

数値をべき乗で計算する Java アプリを開発しています。このアプリケーションではコアが 1 つしか使用されていないため、クアッド コア コンピューターを活用したいと考えています。スレッドを同期する方法についてさまざまなチュートリアルを見てきましたが、実際にはわかりません。私のコードは以下の通りです:

public class Bignum{

public static void main(String[] args){

    Random generator = new Random();   
    long start = System.nanoTime();   
    Random generator1 = new Random();

for (long i=0; i<9000;i++){

    int power = generator1.nextInt (17) + 2;
    int power1 = generator1.nextInt (25) + 2;
    int power2 = generator1.nextInt (72) + 2;

    BigInteger num = BigInteger.valueOf (generator.nextInt (7895) + 1);
    BigInteger num1 = BigInteger.valueOf (generator.nextInt (1250) + 1);
    BigInteger num2 = BigInteger.valueOf (generator.nextInt (9765) + 1);

    BigInteger add = num.pow(power);
    BigInteger add1 = num1.pow(power1);
    BigInteger add2 = num2.pow(power2);

    BigInteger sum = add.add(add1);

}

}
}

たとえば、1 つのスレッドでこれを行うにはどうすればよいでしょうか。

    int power = generator1.nextInt (17) + 2;
    int power1 = generator1.nextInt (25) + 2;
    int power2 = generator1.nextInt (72) + 2;

もう1つはこれを行います:

    BigInteger num = BigInteger.valueOf (generator.nextInt (7895) + 1);
    BigInteger num1 = BigInteger.valueOf (generator.nextInt (1250) + 1);
    BigInteger num2 = BigInteger.valueOf (generator.nextInt (9765) + 1);

別のこれ:

    BigInteger add = num.pow(power);
    BigInteger add1 = num1.pow(power1);
    BigInteger add2 = num2.pow(power2);

そして最後のものはこれを行います:

    BigInteger sum = add.add(add1);

どうすればそれができますか?また、どうすればそれを9000回繰り返すことができますか? ご協力ありがとうございました。

4

3 に答える 3

2

したがって、Java マルチスレッドを始めるには、この本を強くお勧めします。この作品のバイブルのようなものです。

そうは言っても、タスクを保持するためにスレッドプールが必要になり、必要なことを処理し、適切に終了/復帰する「ワーカー」クラス (スレッドになる) を作成する必要があります。その価値。

-スレッドプールを作成する

ExecutorService executor = Executors.newFixedThreadPool(MAX_NUMBER_THREADS_AT_ONCE);

-ワーカータスクを作成する

public static class WorkerTask implements Runnable {
    //member vars if you need em

    WorkerTask() {
        //initialize member vars if you need to
    }

    @Override
    public void run() {
            //do your work here 
    }
}

-次のようにタスクをスレッド プールに追加します。

for( each task you need ){
        Runnable worker = new WorkerTask( constructor params );
        executor.execute(worker);
    }

最後に、2 つの疑問が残ります。

それらが終了するのをどのように待ちますか?

スレッドから値を返すにはどうすればよいですか?

実際、これらの質問には両方とも、問題に固有の解決方法がたくさんありますが、この場合は簡単なことを行うことができると思います. グローバル スコープを持ち、すべてのスレッドからアクセスできるグローバルな静的クラス変数をお勧めします。ここで注意してください。他のスレッドと同じ値を編集しないでください。そのため、ConcurrentHashMap のようなものを使用し、スレッドに回答がある場合は、スレッド ID とその回答をハッシュマップに追加するだけです。例:concurrentMap.add(threadId, value);

すべてのタスクが完了するまで待つには、通常、次のようにします。

executor.shutdown();  //signal that you want to shutdown executor
while(!executor.isTerminated()){
        Thread.sleep(10000);  //wait ten seconds
        System.out.println("Waiting 10 seconds");
}
// now finally traverse your value map and output your answers
于 2013-11-14T21:43:21.817 に答える