2009-06-23 41 views
4

我正在研究java.util.concurrent包的一些教程和示例。通常,示例作者將佔位符標記爲註釋「長時間運行的任務」。由於這些例子是關於併發編程的,我並不熱衷於使用Thread.sleep(long),它被try-catch塊所包圍。Java SDK中用於測試目的的長時間運行方法

你在這些情況下使用什麼?

要打開一個網址,請執行一些複雜的浮點運算,I/O ...最佳的是,這些長時間運行的任務沒有任何副作用。

這些方法可以看作是時間刻度上的羅蘭·伊普斯姆斯。


我會在這裏的具體實現:

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(); 
    } 
} 
+0

有提供無限多的緩慢算法。你的意圖是什麼?你想創建某種教程嗎? – akarnokd 2009-06-23 13:01:30

+0

@ kd304 - 我相信他是在一個教程在這裏筆者離開它作爲「一個練習編輯器」生成長時間運行的任務 – akf 2009-06-23 13:11:24

+0

@akf是灌裝,確實 – 2009-06-23 13:44:28

回答

3

我曾經用一個公共 - 私人密鑰生成器做類似的事情。這是一項CPU密集型任務。做數百次或數千次應該會給你相當大的延遲。

0

我使用I/O(包括本地和非),並經常長時間運行的任務有副作用。

+0

可否請你,輸入一個代碼段。可能是有用的 – 2009-06-23 12:24:26

0

如果談論這無論如何都將需要一個完整的活性的方法,怎麼樣在指定的時間運行一個簡單的循環?

public void triggerKeyGeneration(int nbSec) 
{ 
    long objectiveTime = System.currentTimeMillis() + nbSec*1000; 
    while (System.currentTimeMillis() < objectiveTime); 
} 
0

下面一些問題:

4
BigInteger veryBig = new BigInteger(10000, new Random()); 
veryBig.nextProbablePrime(); 
相關問題