Java ThreadFactory的问题

在我的应用程序中,我使用带有自定义ThreadFactory的线程池.

我的代码看起来像:

pool = Executors.newScheduledThreadPool(10, new TF());

class TF implements ThreadFactory {
    AtomicInteger count = new AtomicInteger(1);
    public synchronized Thread newThread(Runnable r) {
        Thread t = new Thread(r) ;
        t.setName("ThreadPool Thread[" + count.getAndIncrement() + "]");
        t.setUncaughtExceptionHandler(new UEHLogger());
        return t;
    }
}

但是,在向线程池提交各种Runnables后,如果我转储当前线程(来自IDE,Intellij IDEA),我得到:

"ThreadPool Thread[1]" daemon prio=6 tid=0x0334e000 nid=0x1130 waiting on condition [0x0377f000..0x0377fc94]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x22fa7838> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925)
    at java.util.concurrent.DelayQueue.take(DelayQueue.java:160)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:583)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:576)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:619)

"ThreadPool Thread[1]" daemon prio=6 tid=0x0333e400 nid=0x128 waiting on condition [0x0372f000..0x0372fd14]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x22edb9e0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1963)
    at java.util.concurrent.DelayQueue.take(DelayQueue.java:164)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:583)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:576)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:619)

(以及线程2-9的simliar堆栈跟踪)

因此,基本上不是获得1,2,3,4,5,6,7,8,9,10号线程,而是获得编号为1,1,2,3,4,5,6,7,8,9的线程

一切似乎都运转正常,但它显然令人不安.

解决方法:

你没有无意中创建了两个线程池(或两个ThreadFactories),对吗?

通过让每个线程输出其线程工厂的id以及它自己的id来确认这一点可能是一个想法.

上一篇:C# ThreadPool类(线程池)


下一篇:在完成所有线程之前从java方法返回