ThreadLocalRandom Java Example
January 03, 2014
java.util.concurrent.ThreadLocalRandom has been introduced in jdk 7. Like java.util.Random, ThreadLocalRandom is also a random number generator. But ThreadLocalRandom is used in concurrent environment and isolated to current thread. In multithread environment, each thread can get a random number parallel to other thread with the help of ThreadLocalRandom. The random number obtained by one thread has not been affected by the thread. Whereas java.util.Random provides random number globally. So ThreadLocalRandom is a good feature in multithreaded environment. ThreadLocalRandom is used within ForkJoinTask. Find the some methods of ThreadLocalRandom.
current() in ThreadLocalRandom
This method returns ThreadLocalRandom instance for the current thread. ThreadLocalRandom can be initialized as below.ThreadLocalRandom random = ThreadLocalRandom.current();
nextInt in ThreadLocalRandom
nextInt(int least,int bound) returns the next pseudo number . We can pass the least limit and max limit. There are more method like nextDouble, nextLong. So finally we can get random number as belowint i = ThreadLocalRandom.current().nextInt(1, 10);
ThreadLocalRandomDemo.java
package com.concretepage.util.concurrent; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.ThreadLocalRandom; public class ThreadLocalRandomDemo { public static void main(String[] args) { ForkJoinPool pool = new ForkJoinPool(); TestTask task1 = new TestTask("Task one"); TestTask task2 = new TestTask("Task two"); pool.invoke(task1); pool.invoke(task2); } } class TestTask extends ForkJoinTask<String> { private String msg = null; public TestTask(String msg){ this.msg = msg; } private static final long serialVersionUID = 1L; @Override protected boolean exec() { int i = ThreadLocalRandom.current().nextInt(1, 10); System.out.println("ThreadLocalRandom for "+msg+":"+i); return true; } @Override public String getRawResult() { return null; } @Override protected void setRawResult(String value) { } }
ThreadLocalRandom for Task one:5 ThreadLocalRandom for Task two:2