I think you misunderstand how the threading system works in PlayN.
Exec.invokeAsync() is intended to invoke a single "job" on a background thread. When that job completes, it can post its result back to the main game thread using Exec.invokeLater() or using an Exec.deferredPromise().
There is no way (via the PlayN APIs) to start a long-running background thread which passes messages back and forth with the main game thread. Every time you run invokeAsync(), the Runnable "job" you provide will run to completion on an arbitrary background thread. Each platform controls the size of the thread-pool that runs these background jobs, but it's usually more than one background thread so you cannot rely on ordering of invokeAsync() jobs and each job *must* be isolated. It cannot communicate (via mutating shared variables simultaneously) with other invokeAsync() jobs or with code running on the main game thread.
The system is designed for you to structure your code as small units of work that are completed asynchronously. PlayN's HTTP code already runs asynchronously, so you don't have to run that in a background thread yourself.
So as a result of a user action which took place on a game thread, you could issue a Net.get(url) request (which will run in the background automatically), then listen for the response on the returned RFuture, then when you have the result, you can pass that data and whatever processing parameters you want into a Runnable that is executed via Exec.invokeAsync() and do whatever processing you need on a background thread, and when the result of that computation is complete you can deliver it back to the main game thread via Exec.invokeLater() to, for example, update the game UI, or whatever you need.
Android and iOS do happen to support most of Java's low-level thread primitives, so you could probably start your own threads and use whatever JDK classes you want to coordinate between them, but I recommend against it. Most video games use thread-pool-backed job systems like the one PlayN provides, and most modern application frameworks do so as well, because it is a *far* less fragile way to do multi-threaded computation than trying to manage threads yourself and coordinate multiple message queues and avoid deadlock, unnecessary blocking, etc.