I'm working through some tutorials and examples of java.util.concurrent package. Usually example authors put a placeholder marked with a comment 'long running task'. Since these examples are about concurrent programming I'm not keen of using Thread.sleep(long), surrounded by try-catch blocks.
What do you use in these circumstances?
To open an url, do some complicated float math, i/o... Optimally these long running tasks do not have any side effects.
These methods can be seen as Loren Ipsums on the timescale.
I'll add here concrete implementations:
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();
}
}