public void upload() throws Exception {

        ArrayList<File> files = FileFinder.find(localDir);
        Logger.printf("===== [%d] files foud ========\n", files.size());

        Collection<Task> tasks = new ArrayList<Task>();

        int index = 1;
        for(File file :files) {
            tasks.add(new Task(new UploadableFile(s3, localDir, file,  bucketName, targetDir), index++));
        }

        Logger.log("===== Start uploading ========");
        timer = new Timer();

        ExecutorService threadPool = Executors.newFixedThreadPool(numThreads);

        //maybe we'd better try-catch below?
        List<Future<Boolean>> list = threadPool.invokeAll(tasks);

        for (Future<Boolean> fut : list) {
            if(fut.get()) {
                count_success++;
            } else {
                count_failure++;
            }
        }
        threadPool.shutdown();

        end(files.size());
    }