【问题标题】:Java: How to make thread loop until condition metJava:如何使线程循环直到满足条件
【发布时间】:2021-07-03 00:29:39
【问题描述】:

我想使用 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);

【问题讨论】:

    标签: java multithreading while-loop parallel-processing dsa


    【解决方案1】:

    你启动线程:

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

    【讨论】:

    • 好的,它看起来工作正常。然而,当我运行它时,感觉非常非常长,以匹配 p 和 q 值。 Java 有解决方案吗?
    • @RheaDavinAdhiskara 不,那是因为你随机生成这两个数字,自然它可能需要不确定的时间
    【解决方案2】:

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

    您没有等待线程完成。一种解决方案是在您致电thread.start() 后立即添加thread.join()。然而,这使得单独的线程有点无用,因为您的主线程在新线程运行时不做任何工作。

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 2016-04-12
      • 2018-06-29
      • 1970-01-01
      相关资源
      最近更新 更多