code: private List<byte[]> deflateImageDataConcurrently(final PngByteArrayOutputStream inflatedImageData, final Integer compressionLevel) {
  		final Collection<byte[]> results = new ConcurrentLinkedQueue<>();
  
  		final Collection<Callable<Object>> tasks = new ArrayList<>();
  		for (final int strategy : compressionStrategies) {
  			tasks.add(Executors.callable(new Runnable() {
  				@Override
  				public void run() {
  					try {
  						results.add(PngtasticCompressionHandler.this.deflateImageData(inflatedImageData, strategy, compressionLevel));
  					} catch (Throwable e) {
  						PngtasticCompressionHandler.this.log.error("Uncaught Exception: %s", e.getMessage());
  					}
  				}
  			}));
  		}
  
  		final ExecutorService compressionThreadPool = Executors.newFixedThreadPool(compressionStrategies.size());
  		try {
  			compressionThreadPool.invokeAll(tasks);
  		} catch (InterruptedException ex) {
  		} finally {
  			compressionThreadPool.shutdown();
  		}
  
  		return new ArrayList<>(results);
  	}
docs: /*
  Do the work of deflating (compressing) the image data with the
  different compression strategies in separate threads to take
  advantage of multiple core architectures.