Java线程工厂的问题

Java线程工厂的问题,java,threadpool,Java,Threadpool,在我的应用程序中,我使用带有自定义ThreadFactory的threadpool 我的代码如下所示: pool = Executors.newScheduledThreadPool(10, new TF()); class TF implements ThreadFactory { AtomicInteger count = new AtomicInteger(1); public synchronized Thread newThread(Runnable r) {

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

我的代码如下所示:

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;
    }
}
但是,在将各种可运行文件提交到线程池后,如果我转储当前线程(从IDE、Intellij IDEA),我会得到:

“线程池线程[1]”守护程序prio=6 tid=0x0334e000 nid=0x1130等待条件[0x0377f000..0x0377fc94]
java.lang.Thread.State:等待(停车)
在sun.misc.Unsafe.park(本机方法)
-停车等待(java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
位于java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
位于java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925)
位于java.util.concurrent.DelayQueue.take(DelayQueue.java:160)
位于java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:583)
位于java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:576)
位于java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
运行(Thread.java:619)
“线程池线程[1]”守护进程prio=6 tid=0x0333e400 nid=0x128等待条件[0x0372f000..0x0372fd14]
java.lang.Thread.State:定时等待(停车)
在sun.misc.Unsafe.park(本机方法)
-停车等待(java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
位于java.util.concurrent.locks.LockSupport.parknos(LockSupport.java:198)
位于java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1963)
位于java.util.concurrent.DelayQueue.take(DelayQueue.java:164)
位于java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:583)
位于java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:576)
位于java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
运行(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


看起来一切正常,但显然令人不安

您没有无意中创建两个线程池(或两个线程工厂),是吗


通过让每个线程将其线程工厂的id与其自己的id一起输出来确认这一点可能是一个好主意。

Hmm,无法用OpenJDK和以下(高度简化的)测试代码重现问题。下面的表格给了你什么

class TF implements ThreadFactory {

    class UEHLogger implements Thread.UncaughtExceptionHandler
    {
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println(t + " threw exception: " + e);
    }
    }

    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;
    }

    public static void main(String[] a)
    {
    TF myTF = new TF();
    Thread[] threads = new Thread[10];
    for(int i = 0; i < threads.length; i++)
        threads[i] = myTF.newThread(new Runnable(){public void run(){}});
    for(Thread t : threads)
        System.out.println(t);
    }
}
类TF实现ThreadFactory{
类UEHLogger实现Thread.UncaughtExceptionHandler
{
公共无效未捕获异常(线程t,可丢弃的e){
System.out.println(t+“抛出异常:”+e);
}
}
AtomicInteger计数=新的AtomicInteger(1);
公共同步线程newThread(Runnable r){
螺纹t=新螺纹(r);
t、 setName(“线程池线程[“+count.getAndIncrement()+”]);
t、 setUncaughtExceptionHandler(新的UEHLogger());
返回t;
}
公共静态void main(字符串[]a)
{
TF myTF=新的TF();
线程[]线程=新线程[10];
对于(int i=0;i
当newThread方法被同步时,这尤其令人不安。在这种情况下,您甚至不需要使用原子整数……事实上。最初的newThread方法没有同步,我认为这就是问题所在。遗憾的是,不是只有第一个id总是被复制?或者其他id也会出现多次?啊。发现了问题。根据配置值,我的应用程序只能有一个或另一个线程池。我解释配置值的代码很糟糕,所以我实际上是在创建一个适当的池,再加上另一个,只有一个成员。。。。
class TF implements ThreadFactory {

    class UEHLogger implements Thread.UncaughtExceptionHandler
    {
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println(t + " threw exception: " + e);
    }
    }

    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;
    }

    public static void main(String[] a)
    {
    TF myTF = new TF();
    Thread[] threads = new Thread[10];
    for(int i = 0; i < threads.length; i++)
        threads[i] = myTF.newThread(new Runnable(){public void run(){}});
    for(Thread t : threads)
        System.out.println(t);
    }
}