Add multi-threaded version using thread pool