Как закрыть локальный поток автозаполнения, используемый в параллельном потоке? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть переменная ThreadLocal.Я хотел бы использовать это так:

ThreadLocal<AutoCloseable> threadLocal = new ThreadLocal<AutoCloseable>(); // pseudocode
ForkJoinPool fj = new ForkJoinPool(nThreads);
fj.submit(
    () -> myStream.parallel().forEach(e -> {
        /*I want to use the thread local autocloseable here, 
          but how do I close it when this parallel processing is done?*/
    })
);

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Похоже, вы хотите использовать какой-то общий ресурс.Поэтому либо не используйте ThreadLocal (так как каждый поток будет иметь свой собственный экземпляр (или ноль)), и подождите, пока все задачи не будут выполнены

ForkJoinTask task=fj.submit(
    () -> myStream.parallel().forEach(e -> {
//whatever
    })
);
task.get()///wait - timeout would be good here
resource.close();// close that shared resource - wraping all of that with try-with-resources woudl work as well

.

Или просто используйте этот ресурс как сериализованный код - используйте его и закройте в forEach

0 голосов
/ 30 ноября 2018

ThreadLocal закрываются после того, как поток, использующий их, умирает.Если вы хотите контролировать это, вам нужно вместо этого использовать карту.

// do our own thread local resources which close when we want.
Map<Thread, Resource> threadLocalMap = new ConcurrentHashMap<>();

fj.submit(
() -> myStream.parallel().forEach(e -> {
     Resource r = threadLocalMap.computeIfAbsent(Thread.currentThread(), t -> new Resource();
    // use the thread local autocloseable here, 
})

// later once all the tasks have finished.
// close all the thread local resources when the parallel processing is done
threadLocalMap.values().forEach(Utils::closeQuietly);

Обычно существует метод, который закрывает ресурсы, не вызывая исключения.У Chronicle есть одна, но и у многих других библиотек.

public static void closeQuietly(Closeable c) {
    if (c != null) {
       try {
           c.close();
       } catch (IOException ioe) {
           // ignore or trace log it
       }
    }
}

Скорее всего, у вас уже есть метод сделать это в вашем проекте https://www.google.co.uk/search?q=public+static+void+closequietly+Closeable

...