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

Java:如何使线程循环直到满足条件,java,multithreading,while-loop,parallel-processing,dsa,Java,Multithreading,While Loop,Parallel Processing,Dsa,我想用Java实现DSA(数字签名算法)算法。在构建p和q键时,我希望得到(p-1)mod q=0的结果。这是我编写的代码,当我调用q2的内容(p-1 mod q的结果)时,它不会返回0 package random; import java.util.Random; import java.math.BigInteger; public class RandomPrime implements Runnable { BigInteger randomNumber = BigInteg

我想用Java实现DSA(数字签名算法)算法。在构建p和q键时,我希望得到(p-1)mod q=0的结果。这是我编写的代码,当我调用q2的内容(p-1 mod q的结果)时,它不会返回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.start()
后立即添加
thread.join()
。但是,这使得单独的线程变得毫无用处,因为在新线程运行时,主线程不做任何工作。

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

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

启动线程:

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);
您没有给线程足够的时间来实际完成指定的工作。就你而言,打电话

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 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);
您没有给线程足够的时间来实际完成指定的工作。就你而言,打电话

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);

好的,看起来它工作正常。然而,当我运行它的时候,它感觉匹配p和q值非常非常长。Java有解决这个问题的方法吗?@RheaDavinAdhiskara没有,那是因为你随机生成这两个数字,自然需要一段未定义的时间好吧,看起来它工作正常。然而,当我运行它的时候,它感觉匹配p和q值非常非常长。Java有解决这个问题的方法吗?@RheaDavinAdhiskara没有,这是因为您随机生成这两个数字,自然会花费不确定的时间