Return Value from Java Thread Class

So below is a simple Java class using multithreading, and my question is, is there a way for me to store the randomNumber from each thread (maybe in a variable called randomNumberOne or randomNumberTwo), so that I can use those to possibly get the sum of both and return it? I know this example sounds stupid but basically with my real code I am returning a value from each of my threads and want to get the average of them. I haven't found any solution for returning values in threads in java (also I am new to multithreading completely).

public class Example {
  public static void main(String[] args){
    MathThread one = new MathThread();
    MathThread two = new MathThread();

    one.start();
    two.start();
  }
}

class MathThread extends Thread{
   public MathThread(){
   }

public void run(){
    Random rand = new Random();

    int randomNumber = rand.nextInt((100 - 1) + 1) + 1;
    System.out.println(randomNumber);
}

Output

5
33

Upvotes: 0

Views: 99

Answers (3)

manzur
manzur

Reputation: 692

Here is the simple snippet to customize:

// 1. Create and fill callables to execute
List<Callable<Integer>> callables = new LinkedList<>(); 
// callabels.addAll(makeMeCallables());

// 2. Run using Executor of your choice
ExecutorService service = Executors.newCachedThreadPool();
List<Future<Integer>> results = service.invokeAll(callables);

// 3. Get the results 
if (results.get(i).isDone()) {
    Future f = result.get(i);   
    // process f.get()
}

Upvotes: 0

Peter Lawrey
Peter Lawrey

Reputation: 533520

In Java 8 you can do

IntStream.of(0, 2).parallel()
         .map(i -> new Random().nextInt(100)+1)
         .forEach(System.out::println);

Without using the Stream API you can do

List<Future> futures = new ArrayList<>();
for (int i = 0; i < 2; i++)
    futures.add(ForkJoinPool.commonPool()
                            .submit(new Callable<Integer>() {
                                public Integer call() {
                                   return new Random().nextInt(100)+1;
                                }));
for(Future<Integer> future : futures)
   System.out.printl(future.get());

Upvotes: 1

clcto
clcto

Reputation: 9648

Add a result variable to your MathThread class and get the value after you join the thread:

class MathThread extends Thread
{
    private int result;
    public int getResult()
    { 
       this.join();
       return result;
    }

    public void run()
    {
       // ...

       result = randomNumber;
    }
}

one.start();
two.start();

double average = (one.getResult() + two.getResult()) / 2.0;

Upvotes: 3

Related Questions