ROJDAR 2024-03-02 17:36 采纳率: 30%
浏览 4
已结题

为什么通过ThreadPoolExecutor创建线程池时,直接重写newThread()方法后,submit()方法或者executor()方法不会执行?

为什么通过ThreadPoolExecutor创建线程池时,直接重写newThread()方法后,submit()方法或者executor()方法不会执行?

// 创建ThreadPoolExecutor

 public static ThreadPoolExecutor createExecutors() {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 7, 60L,
                TimeUnit.SECONDS, new LinkedBlockingQueue(),createThreadFactory());
        return executor;
    }

//创建threadFactory

    public static ThreadFactory createThreadFactory() {
//        return new ThreadPoolTaskExecutor();

        return new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                System.out.println("新建线程" + r.hashCode());
                return new Thread("新建线程" + r.hashCode());
            }
        };
    }

//提交任务

public static void create1() {
        ThreadPoolExecutor ex = createExecutors();
        ex.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("任务开始执行" );
            }
        });
        ex.shutdown();
    }

如果threadFactory用重写的方式,仅仅新建了线程:

img

如果返回threadfactory的实现类,会正常执行任务:

img

如果我new ThreadPoolTaskExecutor();返回的话 就会正常执行到run()方法中的任务,但是如果我重写newThread()方法并且返回的话,则仅仅会新建线程而已,走不到submit()方法,请问原因是什么呢?

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2024-03-02 17:36
    关注

    ROJDAR 下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    通过ThreadPoolExecutor创建线程池时,直接重写newThread()方法后,submit()方法或者execute()方法不会执行的原因是:在重写newThread()方法时,没有将Runnable任务对象传递给Thread线程对象进行执行。

    解决方案如下:

    1. 在重写newThread()方法时,将Runnable任务对象传递给Thread线程对象进行执行。

    示例代码如下:

    public static ThreadFactory createThreadFactory() {
        return new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                System.out.println("新建线程" + r.hashCode());
                **Thread thread = new Thread(r);  // 将Runnable任务对象传递给Thread线程对象进行执行**
                thread.start();  // 开启线程
                return thread;
            }
        };
    }
    
    1. 返回实现了ThreadFactory接口的类ThreadPoolTaskExecutor的实例,并在实例化时将Runnable任务对象传递给Thread线程对象进行执行。

    示例代码如下:

    public static ThreadFactory createThreadFactory() {
        return new ThreadPoolTaskExecutor();
    }
    

    *请确认你是否将第二种方式中的ThreadPoolTaskExecutor类的实例化代码放入return语句中,若没有,请将其放入return语句中。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月10日
  • 已采纳回答 3月2日
  • 创建了问题 3月2日