Java implementing task on another thread with javascript-like promise resolve-reject
the ServiceProvider is supposed to provide a singleton instance of UserService but it does not follow all the principles of the Singleton design pattern. specifically, the locking mechanisms that prevent multiple threads from creating multiple instances of UserService (or rather, multiple calling of the constructor)

and while on the subject - why not use Dependency Injection?

also, reject(response) is never called

with regard to the issue of the "javascript-like promise resolve-reject": Java has such a mechanism: CompletableFuture where you supply a Runnable and for the callbacks there are thenApply() thenAccept() and thenRun() methods.  exceptions are handled by exceptionally() method. There are other capabilities like chaining CompletableFuture instances (thenCompose().