use thread pool to avoid locking