yanze chen created IOTDB-5471:
---------------------------------

             Summary: Add isDone() check in 
WrappedThreadPoolExecutor#afterExecute
                 Key: IOTDB-5471
                 URL: https://issues.apache.org/jira/browse/IOTDB-5471
             Project: Apache IoTDB
          Issue Type: Improvement
            Reporter: yanze chen
            Assignee: yanze chen


I want to use the thread pool created by the IoTDBThreadPoolFactory in 
CompleteFuture. However, I have found that this can cause problems with threads 
not being released.

Here is the example code.
{code:java}
import org.apache.iotdb.commons.concurrent.IoTDBThreadPoolFactory;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;

public class Tests {

  public static void main(String[] args) {
    ExecutorService flushTaskExecutor1 = 
IoTDBThreadPoolFactory.newFixedThreadPool(2, "1");
    CompletableFuture<Void>[] completableFutures = new CompletableFuture[5];
    for (int j = 0; j < 5; j++) {
      completableFutures[j] =
          CompletableFuture.supplyAsync(
              () -> {
                System.out.println("run");
                return null;
              },
              flushTaskExecutor1);
    }
    CompletableFuture.allOf(completableFutures).join();
    System.out.println("done");
    flushTaskExecutor1.shutdown();
  }
}
 {code}
Only two “run” are printed, whereas the expectation is that 5 “run” should be 
printed. if I change the thread creation code to 
{code:java}
ExecutorService flushTaskExecutor1 = Executors.newFixedThreadPool(2); {code}
, it works as expected.

Using the thread dump, I found that the thread was blocking at 
WrappedThreadPoolExecutor#afterExecute after execution. This was due to a 
problem with the implementation of CompleteFuture#AsyncRun. One solution I 
found in 
[https://stackoverflow.com/questions/2248131/handling-exceptions-from-java-executorservice-tasks]
 is to add the isDone check before invoking get().  The {{isDone()}} check is 
necessary in certain cases to avoid blocking. See 
[bugs.openjdk.org/browse/JDK-8071638|https://bugs.openjdk.org/browse/JDK-8071638]
 and 
[bugs.openjdk.org/browse/JDK-7146994|https://bugs.openjdk.org/browse/JDK-7146994]
 for details.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to