Java:如何使线程循环直到条件满足

问题描述

我想使用 Java 实现 DSA(数字签名算法)算法。在构建 p 和 q 键时,我想要 (p-1) mod q = 0 的结果。这是我编写的代码,当我调用 q2 的内容(p-1 mod q 的结果)时,它没有' t 返回 0。

package random;
import java.util.Random;
import java.math.BigInteger;

public class RandomPrime implements Runnable {
    BigInteger randomNumber = BigInteger.probablePrime(512,new Random());
    BigInteger randomNumber2 = BigInteger.probablePrime(160,new Random());
    BigInteger p = randomNumber;
    BigInteger q = randomNumber2;
    BigInteger q2 = p.subtract(BigInteger.ONE).remainder(q);

    @Override
    public void run() {
        while(!q2.equals(BigInteger.ZERO)){
            randomNumber = BigInteger.probablePrime(512,new Random());
            randomNumber2 = BigInteger.probablePrime(160,new Random());
            p = randomNumber;
            q = randomNumber2;
            q2 = p.subtract(BigInteger.ONE).remainder(q);
        }
    }

    public BigInteger getPValue() {
        return p;
    }
    public BigInteger getQValue() {
        return q;
    }
    public BigInteger getQ2Value() {
        return q2;
    }
}

我是这么称呼的

RandomPrime rPrime = new RandomPrime();
Thread thread = new Thread(rPrime);
thread.start();
BigInteger p = rPrime.getPValue();
BigInteger q = rPrime.getQValue();
BigInteger q2 = rPrime.getQ2Value();

System.out.println("p:" +p);
System.out.println("q:" +q);
System.out.println("q2:" +q2);

解决方法

您开始线程:

Thread thread = new Thread(rPrime);
thread.start();

然后您立即调用结果:

BigInteger p = rPrime.getPValue();
BigInteger q = rPrime.getQValue();
BigInteger q2 = rPrime.getQ2Value();

System.out.println("p:" +p);
System.out.println("q:" +q);
System.out.println("q2:" +q2);

您没有为线程实际完成分配的工作留出足够的时间。在你的情况下调用 thread.join()

join 方法允许一个线程等待完成 另一个。

启动后就足够了,让初始线程等待第二个线程完成,即:

RandomPrime rPrime = new RandomPrime();
Thread thread = new Thread(rPrime);
thread.start();

try {
     thread.join();
} catch (InterruptedException e) {
   // do something
}
BigInteger p = rPrime.getPValue();
BigInteger q = rPrime.getQValue();
BigInteger q2 = rPrime.getQ2Value();

System.out.println("p:" +p);
System.out.println("q:" +q);
System.out.println("q2:" +q2);
,

我不熟悉您正在实施的算法。但至少存在以下问题:

您不是在等待线程完成。对此的一种解决方案可能是在调用 thread.join() 后立即添加 thread.start()。但是,这会使单独的线程变得毫无用处,因为您的主线程在新线程运行时不做任何工作。