Deadlock in ThreadPoolExecutor

Posted by Vitaly on Stack Overflow See other posts from Stack Overflow or by Vitaly
Published on 2009-09-08T10:12:21Z Indexed on 2010/03/12 15:27 UTC
Read the original article Hit count: 370

Filed under:
|

Encountered a situation when ThreadPoolExecutor is parked in execute(Runnable) function while all the ThreadPool threads are waiting in getTask func, workQueue is empty.

Does anybody have any ideas?

The ThreadPoolExecutor is created with ArrayBlockingQueue, corePoolSize == maximumPoolSize = 4

[Edit] To be more precise, the thread is blocked in ThreadPoolExecutor.exec(Runnable command) func. It has the task to execute, but doesn't do it.

[Edit2] The executor is blocked somewhere inside the working queue (ArrayBlockingQueue).

[Edit3] The callstack:

thread = front_end(224)
at sun.misc.Unsafe.park(Native methord)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:747)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:778)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1114)
at
java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
at java.util.concurrent.ArrayBlockingQueue.offer(ArrayBlockingQueue.java:224)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:653)
at net.listenThread.WorkersPool.execute(WorkersPool.java:45)

at the same time the workQueue is empty (checked using remote debug)

[Edit4] Code working with ThreadPoolExecutor:

public WorkersPool(int size) {
  pool = new ThreadPoolExecutor(size, size, IDLE_WORKER_THREAD_TIMEOUT, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(WORK_QUEUE_CAPACITY),
    new ThreadFactory() {
      @NotNull
      private final AtomicInteger threadsCount = new AtomicInteger(0);

      @NotNull
      public Thread newThread(@NotNull Runnable r) {
        final Thread thread = new Thread(r);
        thread.setName("net_worker_" + threadsCount.incrementAndGet());
        return thread;
      }
    },

    new RejectedExecutionHandler() {
      public void rejectedExecution(@Nullable Runnable r, @Nullable ThreadPoolExecutor executor) {
        Verify.warning("new task " + r + " is discarded");
      }
    });
}

public void execute(@NotNull Runnable task) {
  pool.execute(task);
}

public void stopWorkers() throws WorkersTerminationFailedException {
  pool.shutdownNow();
  try {
    pool.awaitTermination(THREAD_TERMINATION_WAIT_TIME, TimeUnit.SECONDS);
  } catch (InterruptedException e) {
    throw new WorkersTerminationFailedException("Workers-pool termination failed", e);
  }
}

}

© Stack Overflow or respective owner

Related posts about java

Related posts about concurrency