ThreadPoolExecutor and finalization
Peter Levart
peter.levart at gmail.com
Thu Nov 2 17:24:35 UTC 2017
Hi Jason,
On 11/02/2017 05:13 PM, Jason Mehrens wrote:
> Peter,
>
> Executors.unconfigurableExecutorService was not modified on purpose because of the following case: http://cs.oswego.edu/pipermail/concurrency-interest/2006-March/002353.html
>
> Jason
Oh, I see. The method is meant to provide a limited view over any
ExecutorService and there may be multiple views over same instance.
Regards, Peter
>
> ________________________________________
> From: core-libs-dev <core-libs-dev-bounces at openjdk.java.net> on behalf of Peter Levart <peter.levart at gmail.com>
> Sent: Thursday, November 2, 2017 10:23 AM
> To: David Holmes; Roger Riggs
> Cc: core-libs-dev
> Subject: Re: ThreadPoolExecutor and finalization
>
> Hi,
>
> On 11/02/2017 01:47 PM, David Holmes wrote:
>>> public class CleanableExecutorService implements ExecutorService {
>>> private final ThreadPoolExecutor tpe;
>>>
>>> public CleanableExecutorService(ThreadPoolExecutor tpe) {
>>> CleanerFactory.cleaner().register(this, tpe::shutdown);
>>> this.tpe = tpe;
>>> }
>>>
>>> // implement and delegate all ExecutorService methods to tpe...
>>> }
>> Ah I see - the old "extra level of indirection" solution. :) The
>> Cleaner keeps the tpe strongly reachable, but as soon as the holder
>> class becomes "unreachable" the Cleaner will shutdown the tpe.
> I see there already is the following method in Executors:
>
> public static ExecutorService newSingleThreadExecutor() {
> return new FinalizableDelegatedExecutorService
> (new ThreadPoolExecutor(1, 1,
> 0L, TimeUnit.MILLISECONDS,
> new LinkedBlockingQueue<Runnable>()));
> }
>
> private static class FinalizableDelegatedExecutorService
> extends DelegatedExecutorService {
> FinalizableDelegatedExecutorService(ExecutorService executor) {
> super(executor);
> }
> @SuppressWarnings("deprecation")
> protected void finalize() {
> super.shutdown();
> }
> }
>
>
> If the same FinalizableDelegatedExecutorService was used also for the
> following method:
>
> /**
> * Returns an object that delegates all defined {@link
> * ExecutorService} methods to the given executor, but not any
> * other methods that might otherwise be accessible using
> * casts. This provides a way to safely "freeze" configuration and
> * disallow tuning of a given concrete implementation.
> * @param executor the underlying implementation
> * @return an {@code ExecutorService} instance
> * @throws NullPointerException if executor null
> */
> public static ExecutorService
> unconfigurableExecutorService(ExecutorService executor) {
> if (executor == null)
> throw new NullPointerException();
> return new DelegatedExecutorService(executor);
> }
>
>
> ...we would get such ExecutorService out of the box.
>
>
> Regards, Peter
>
More information about the core-libs-dev
mailing list