A Thread is GC's own root. Therefore, at any time when you create a stream, despite its creation context, it will not be ready for the GC until its execution method is completed. This is true even if the local method is complete and the thread is still alive.
Example:
public void doSomeAsync(){
Thread th = new Thread(new Runnable(){
public void run(){
Thread.sleep(500);
}
});
th.start();
}
//do somethign else quickly , , , GC. th GC .