代码之家  ›  专栏  ›  技术社区  ›  Boris Pavlović

用于测试目的的Java SDK长运行方法

  •  4
  • Boris Pavlović  · 技术社区  · 15 年前

    我正在学习java.util.concurrent包的一些教程和示例。通常,示例作者会放置一个标有注释“长时间运行的任务”的占位符。因为这些例子是关于并发编程的,所以我不喜欢使用thread.sleep(long),它被try-catch块包围。

    在这种情况下你用什么?

    打开一个URL,做一些复杂的浮点运算,I/O…最理想的是,这些长时间运行的任务没有任何副作用。

    这些方法在时间尺度上可以看作是洛伦ipsums。


    我将在这里添加具体的实现:

    import java.math.BigInteger;
    import java.security.KeyPairGenerator;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.SecureRandom;
    import java.util.Random;
    
    
    public class LongRunningTasks {
        public void triggerKeyGeneration(int iterations) {
            try {
                long start = System.currentTimeMillis();
                for (int i = 0; i < iterations; i++) {
                    KeyPairGenerator keyGen =
                        KeyPairGenerator.getInstance("DSA", "SUN");
                    SecureRandom random =
                        SecureRandom.getInstance("SHA1PRNG", "SUN");
                    keyGen.initialize(1024, random);
                    keyGen.generateKeyPair();
                }
                System.out.println("triggerKeyGeneration: " + (System.currentTimeMillis() - start));
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchProviderException e) {
                e.printStackTrace();
            }
        }
    
        private static final int SCALE = 10000;
        private static final int ARRINIT = 2000;
    
        /**
         * http://www.codecodex.com/wiki/index.php?title=Digits_of_pi_calculation#Java
         * 
         * @param digits - returns good results up to 12500 digits
         * @return
         */
        public String piDigits(int digits){
            StringBuffer pi = new StringBuffer();
            int[] arr = new int[digits + 1];
            int carry = 0;
    
            for (int i = 0; i <= digits; ++i)
                arr[i] = ARRINIT;
    
            for (int i = digits; i > 0; i-= 14) {
                int sum = 0;
                for (int j = i; j > 0; --j) {
                    sum = sum * j + SCALE * arr[j];
                    arr[j] = sum % (j * 2 - 1);
                    sum /= j * 2 - 1;
                }
    
                pi.append(String.format("%04d", carry + sum / SCALE));
                carry = sum % SCALE;
            }
            return pi.toString();
        }
    
        private static final Random rand = new Random();
        private static final BigInteger veryBig = new BigInteger(1200, rand);
    
        public BigInteger nextProbablePrime() {
            return veryBig.nextProbablePrime();
        }
    }
    
    6 回复  |  直到 15 年前
        1
  •  3
  •   kgiannakakis    15 年前

    我曾经用一个公私密钥生成器来做类似的事情。这是一项CPU密集型任务。成百上千次这样做会给你带来相当大的延误。

        2
  •  6
  •   user127605    15 年前
    BigInteger veryBig = new BigInteger(10000, new Random());
    veryBig.nextProbablePrime();
    
        3
  •  1
  •   Spyder    15 年前

    计算pi到非常多的数字。一个快速的谷歌 this implementation 这应该是个技巧:)

        4
  •  0
  •   dfa    15 年前

    我使用I/O(本地和非本地),通常长时间运行的任务会产生副作用。

        5
  •  0
  •   Gnoupi    15 年前

    如果谈论的方法无论如何都需要一个完整的活动,那么一个简单的循环在指定的时间内运行如何?

    public void triggerKeyGeneration(int nbSec)
    {
        long objectiveTime = System.currentTimeMillis() + nbSec*1000;
        while (System.currentTimeMillis() < objectiveTime);
    }
    
        6
  •  0
  •   David Rabinowitz    15 年前

    这里有一些问题: