Java.util 包的ThreadLocalRandom类是一个随机数生成器,它生成与当前线程隔离的随机数。它是 Random 类的子类。它使用内部生成的无法修改的种子值进行初始化。
ThreadLocalRandom 在多个线程同时运行的应用程序中很有用,因为随机数生成保持隔离,线程不必竞争共享实例(如 Random 类实例的情况),并提供更好的性能和更低的开销。但是,它在加密方面并不安全。这就是 SecureRandom 发挥作用的地方,本文稍后将对此进行讨论。
句法:
public class ThreadLocalRandom extends Random
ThreadLocalRandom 的用法一般是这样的:
ThreadLocalRandom.current().nextX(...) {where X = Int, Long, Double etc}
执行:
假设在 main() 方法中创建了两个线程。现在在 run() 方法中,我们调用 ThreadLocalRandom.current.nextInt()。 Thread 类的 run() 方法是写入任何线程的可执行部分的地方。当使用 start() 方法启动线程时,run() 被内部调用。当我们调用 ThreadLocalRandom 的 nextInt() 方法时,线程会运行并生成随机整数值。
它们可能用相同的种子值生成相同的数字,但生成仍然是孤立的,即没有空间竞争,就像在共享对象的情况下一样。
例子:
Java
// java Program to illustrate ThreadLocalRandom class
// Importing class from java.util.concurrent package
import java.util.concurrent.ThreadLocalRandom;
// Main class
public class ThreadLocalRandomNumbers extends Thread {
// The run() method of the Thread class
// Must be defined by every class that extends it
public void run()
{
// Try method to check for exceptions
try {
// Call the ThreadLocalRandom
int r = ThreadLocalRandom.current().nextInt(20);
// Print the generated number r
System.out.println(
"Thread " + Thread.currentThread().getId()
+ " generated " + r);
}
// Catch block to handle the exceptions
catch (Exception e) {
System.out.println("Exception");
}
}
public static void main(String[] args)
{
// Create 2 threads
ThreadLocalRandomNumbers t1
= new ThreadLocalRandomNumbers();
ThreadLocalRandomNumbers t2
= new ThreadLocalRandomNumbers();
// Start the threads using the start() method
t1.start();
t2.start();
}
}
Java
// Java Program to illustrate SecureRandom Class
// Importing class from java.security package
import java.security.SecureRandom;
// Main class
public class SecureRandomNumbers {
// Main driver method
public static void main(String[] args)
{
// Try block to check for exceptions
try {
// Create an instance of SecureRandom
// using the default constructor
SecureRandom r = new SecureRandom();
// Initialise a seed value
int seed = 100;
System.out.println("Random Numbers");
for (int i = 0; i < 5; i++) {
// Use the nextInt() method to generate
// random numbers between 0 and seed-1
// inclusive
System.out.print(r.nextInt(seed) + " ");
}
}
// Catch block to handle the exceptions
catch (Exception e) {
System.out.print("Exception");
}
}
}
Thread 11 generated 2
Thread 12 generated 10
Java.util 包的SecureRandom类是加密安全的随机数生成器。它是 Random 类的子类。加密安全随机数符合 FIPS 140-2,加密模块的安全要求,第 4.9.1 节中指定的统计随机数生成器测试。 SecureRandom 产生非确定性输出,这是此类模块的必要要求。
句法:
public class SecureRandom extends Random
让我们举个例子,在下面给出的代码中,我们创建 SecureRandom 类的一个实例并初始化种子值。接下来我们使用 for 循环调用 nextInt() 方法 5 次。 nextInt()方法使用种子值生成从 0 到 seed-1(含)的整数。所有这些都是在 try-catch 块中完成的,因为它在任何在线编译器上使用时都会引发异常(阅读下面给出的注释)。
例子
Java
// Java Program to illustrate SecureRandom Class
// Importing class from java.security package
import java.security.SecureRandom;
// Main class
public class SecureRandomNumbers {
// Main driver method
public static void main(String[] args)
{
// Try block to check for exceptions
try {
// Create an instance of SecureRandom
// using the default constructor
SecureRandom r = new SecureRandom();
// Initialise a seed value
int seed = 100;
System.out.println("Random Numbers");
for (int i = 0; i < 5; i++) {
// Use the nextInt() method to generate
// random numbers between 0 and seed-1
// inclusive
System.out.print(r.nextInt(seed) + " ");
}
}
// Catch block to handle the exceptions
catch (Exception e) {
System.out.print("Exception");
}
}
}
Random Numbers
Exception
输出
注意: SecureRandom 类由于其加密安全性质而不适用于在线编译器。但是,如果您在系统上使用 IDE,您将能够获得上图所示的输出。