JEP 102 Process Updates revised API draft
Peter Levart
peter.levart at gmail.com
Fri Mar 13 14:58:27 UTC 2015
On 03/13/2015 02:35 PM, Roger Riggs wrote:
> Hi Peter,
>
> Right, that is the preferred handling.
> In this case, the forwarded interrupt will be passed back to the
> Thread from the ThreadPool
> and is disregarded there.
I thought that too, but is not necessarily so. For example:
Process p = ...
p.onExit().thenAccept(p1 -> {
Thread.sleep(...); // will be thrown here!
});
Peter
>
> Roger
>
>
> On 3/13/2015 3:56 AM, Peter Levart wrote:
>> ...in addition, I would also try not to swallow interrupts in default
>> implementation:
>>
>>
>> public CompletableFuture<Process> onExit() {
>> return CompletableFuture.supplyAsync(() -> {
>> boolean interrupted = false;
>> while (true) {
>> try {
>> waitFor();
>> break;
>> } catch (InterruptedException x) {
>> interrupted = true;
>> }
>> }
>> if (interrupted) {
>> Thread.currentThread().interrupt();
>> }
>> return this;
>> });
>> }
>>
>>
>> Peter
>>
>> On 03/13/2015 08:35 AM, Peter Levart wrote:
>>> Hi Rogger,
>>>
>>> Now that the method has a non-throwing default implementation, what
>>> do you think of the following implementation note for Process.onExit():
>>>
>>> * @implNote
>>> * The default implementation of this method employs a thread from
>>> * {@link java.util.concurrent.ForkJoinPool#commonPool() common
>>> pool}
>>> * to {@link #waitFor() wait} for process exit, which might
>>> consume a lot
>>> * of memory for thread stacks if large number of processes are
>>> waited for
>>> * concurrently.<p>
>>> * External implementations are advised to override this method
>>> and provide
>>> * more efficient implementation, for example, if the
>>> implementation also
>>> * provides {@link #toHandle()} method, it can simply do the
>>> following:
>>> * <pre>{@code
>>> * public CompletableFuture<Process> onExit() {
>>> * return toHandle().onExit().thenApply(ph -> this);
>>> * }
>>> * }</pre>
>>> * ...which in case of internal implementation of ProcessHandle
>>> * ({@link java.lang.ProcessHandle#of(long)}}), employs a more
>>> efficient
>>> * mechanism for waiting on process exit.
>>>
>>>
>>>
>>> Regards, Peter
>>>
>>>
>>> On 03/12/2015 11:33 PM, Peter Levart wrote:
>>>>
>>>>
>>>> On 03/12/2015 09:41 PM, Roger Riggs wrote:
>>>>> Hi Peter,
>>>>>
>>>>> Introducing a public Process subtype would not be a binary
>>>>> compatible change;
>>>>> the return type of ProcessBuilder.start can not be narrowed.
>>>>> As you surmised, a different start method would be needed on
>>>>> ProcessBuilder.
>>>>> Since ProcessBuilder is the preferred mechanism to created
>>>>> processes, I would
>>>>> leave Runtime.exec alone to avoid a proliferation of similar methods.
>>>>>
>>>>> If ProcessHandle were an interface, Process would still have the
>>>>> conflict over the
>>>>> return type of onExit() since CompletableFuture<Process> is not
>>>>> type compatible
>>>>> with CF<ProcessHandle>. So not quite the winning combination to
>>>>> enable polymorphism.
>>>>>
>>>>> Roger
>>>>
>>>> That's right. The delegation approach with unrelated Process /
>>>> ProcessHandle seems to be the most clean from API perspective.
>>>>
>>>> Regards, Peter
>>>>
>>>>>
>>>>>
>>>>> On 3/12/2015 10:38 AM, Peter Levart wrote:
>>>>>> On 03/12/2015 02:39 PM, Roger Riggs wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> Just a thought, it might be useful to introduce a public subtype
>>>>>>> of Process that is
>>>>>>> returned from ProcessBuilder for which the guarantees about
>>>>>>> behavior could be
>>>>>>> tighter (no UOEs). It would also provide a place to document
>>>>>>> the behaviors
>>>>>>> now spread across ProcessBuilder and Process.
>>>>>>>
>>>>>>> $.02, Roger
>>>>>>>
>>>>>>
>>>>>> That was my thinking too today. A Process2 or XProcess? If
>>>>>> ProcessHandle was an interface this subtype could implement it
>>>>>> (back to square one). I think it could be an interface if
>>>>>> Process2 was not publicly extendable (package-protected
>>>>>> constructor) as it would not represent part of extensible API.
>>>>>>
>>>>>> Does that mean that we would need additional methods
>>>>>> ProcessBuilder.start2() / Runtime.exec2() too?
>>>>>>
>>>>>> Peter
>>>>>>
>>>>
>>>>
>>>
>>>
>>
>
More information about the core-libs-dev
mailing list