On 02/13/2015 04:34 PM, Peter Levart wrote:
On 02/13/2015 04:18 PM, David M. Lloyd wrote:
I hesitate to mention it, but as someone who has been frustrated by
this same problem on numerous occasions I feel I must suggest that
maybe... having a completableFuture method should just be dropped? A
user should be able to implement it themselves fairly easily, right?
And they'd be able to sidestep problems like stack size and so on by
managing their own threads.
That's a good idea. If the following two methods were added to
Process[Handle]:
public class ProcessHandle {
public ProcessHandle waitForUninterruptibly();
}
public class Process extends ProcessHandle {
@Override
public Process waitForUninterruptibly();
}
One could get CompletableFuture(s) simply by:
ProcessHandle ph = ...;
CompletableFuture<ProcessHandle> phf =
CompletableFuture.supplyAsync(ph::waitForUninterruptibly);
Process p = ...;
CompletableFuture<Process> pf =
CompletableFuture.supplyAsync(p::waitForUninterruptibly);
Peter
Well, the above suggestion has a drawback too. Currently (with latest
implementation), waiting on process exit is done by a small-stack thread
and when process exits, this thread submits a task to the system FJ pool
executor that executes user code in normal-stack thread. With above
suggestion, the behaviour would be different depending on platform:
- Windows: waiting on process exit would be executed by normal-stack
thread which would also run user code afterwards.
- UNIX: waiting on process exit would be executed by small-stack thread
+ there would be another normal-stack thread occupied with waiting on
small-stack thread to signal completion.
Consumption of occupied threads, while waiting on process exits, would
be doubled on UNIX and normal-stack threads would be occupied on both
platforms for waiting.
Current code is more effective in this respect.
Peter