public static void runCallable(){
		List<Future<Long>> list = new ArrayList<Future<Long>>();
		try {
			ThreadPoolExecutor executor = ExecutorsFactory.getNewExecutorsPool();
			Monitor monitor = new Monitor(executor, 3);
			Thread monitorThread = new Thread(monitor);
			monitorThread.start();
			for(int i = 0; i < Configuration.WORKERS_NUMBER; i++) {
				CallableWorker callableWorker = new CallableWorker(String.valueOf(1));
				
				try {
					Future<Long> submit = executor.submit(callableWorker);
					list.add(submit);
				} catch (RejectedExecutionException e) {
					System.out.printf("A rejected Worker doesn't go into the list...\n");
				}
			}

			System.out.printf("There are %d future in the list:\n", list.size());
			for(Future<Long> future : list) {
				System.out.printf(" - %s\n", future.toString());
			}
			
			long returnedTime = 0;
			Iterator<Future<Long>> iterator = Iterators.cycle(list);
			while(iterator.hasNext()) {
				try {
					Future<Long> future = iterator.next();
					if (future.isDone()) {
						System.out.printf("%s is done.\n", future.toString());
						returnedTime += future.get();
						iterator.remove();
					} else {
						System.out.printf("%s is still working...\n", future.toString());
						Thread.sleep(5000);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (ExecutionException e) {
					e.printStackTrace();
				}
			}

			System.out.printf("Total computation Time: %d seconds\n.", returnedTime/1000);

			executor.shutdown();
			while (!executor.isTerminated()) {
				System.out.printf(".");
				Thread.sleep(100);
			}
			System.out.printf("\nAll workers done. Bye\n");
			monitor.shutdown();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}