//package com.imatia.elcodedocle.tools.tests.callabletest;


import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.*;

class Worker {

    private final CountDownLatch startSignal;
    private final CountDownLatch doneSignal;
    private final int threadNumber;

    Worker(
            CountDownLatch startSignal,
            CountDownLatch doneSignal,
            int threadNumber
    ){

        this.startSignal = startSignal;
        this.doneSignal = doneSignal;
        this.threadNumber = threadNumber;

    }

    public String[][] getSomeStrArrArr() {

        String[][] someStrArrArr = new String[1][1];

        try {

            startSignal.await();
            System.out.println("Running thread number "+threadNumber);

            if (threadNumber == 1) {
                // get String[][] result for thread number 1
                someStrArrArr[0][0] = "Result of thread number 1";
            }

            if (threadNumber == 2) {
                // get String[][] result for thread number 2
                someStrArrArr[0][0] = "Result of thread number 2";
            }

            if (threadNumber == 3) {
                // get String[][] result for thread number 3
                someStrArrArr[0][0] = "Result of thread number 3";
            }

            doneSignal.countDown();

        } catch (InterruptedException ex) {

            System.out.println(
                    "Thread number "+threadNumber+" has been interrupted."
            );

        }

        return someStrArrArr;

    }

    public Callable<String[][]> getSomeCallableStrArrArr(){
        return new Callable<String[][]>() {
            public String[][] call() throws Exception {
                return getSomeStrArrArr();
            }
        };
    }

}

class CallableTest {

    public static void main (String[] args)
            throws java.lang.Exception
    {
        ExecutorService pool = Executors.newFixedThreadPool(3);
        Set<Future<String[][]>> set = new HashSet<Future<String[][]>>();
        CountDownLatch startSignal = new CountDownLatch(1);
        CountDownLatch doneSignal = new CountDownLatch(3);
        for (int i=1;i<=3;i++) {
            Worker worker = new Worker(startSignal,doneSignal,i);
            Callable<String[][]> callable =
                    worker.getSomeCallableStrArrArr();
            Future<String[][]> future = pool.submit(callable);
            set.add(future);
        }
        System.out.println("Awaiting...");
        startSignal.countDown();
        doneSignal.await();
        System.out.println("Ready.");

        for(Future<String[][]> future : set){
            String[][] result = future.get();
            for (String[] strArr: result){
                for (String str: strArr){
                    System.out.println(str);
                }
            }
        }

        System.exit(0);
    }

}