java线程池工作使用问题和疑问

创建一个线程池

ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 10, 5, TimeUnit.SECONDS, new SynchronousQueue<>(),new MyThreadFactory("wangjg"));

再创建一个线程

Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                    System.out.println(Thread.currentThread().getName() + " run");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        };

再将线程提交到线程池中

Future<?> submit = executor.submit(myRunnable);

问几个问题:
1、在线程执行完成后jvm进程任然还在,指到shutdown后才会停止,那么后面再需要使用线程池又必须重新new一个了,是这样的吗?
2、和第一个类似,在日常开发工作中,线程池是通用一个的,还是各自开发自己new一个线程池,如果是共用的,那么什么时候执行shutdown?

一般线程池都会有一个线程池管理类,里面有作用不同的线程池,然后提供线程池的建立以及获取。然后通过这个来获取具体的线程池来进行任务的执行

shutdown一般是整个程序执行完毕的时候调用. 可以用一个线程池执行不同功能的Runable.

shutdown()只是阻止继续提交run任务,shutdownNow()才是真正关闭线程池(停止线程池所有线程),具体线程池该何时关闭,这个得看你应用
,如果你只是临时要执行一堆run任务,有没就不用线程池了,那么执行完任务就可以把线程池关闭,如果你应用经常需要线程池那就不用关闭,比如tomcat就维护了一个线程池用来处理客户端连接请求,除非你关闭tomcat,否则线程池始终保持可运行状态

线程池可以共用,处理A类型的任务可以和处理B类型的任务共用一个线程池,但如果A类型任务耗时总是很长,B耗时短,那么这两种类型任务最好各自创建
线程池。不然A类型任务长时间占用线程池导致B得不到机会执行

  1. 既然后面要再使用,你为什么还要shutdown呢?如果一直用,线城池完全可以不关。
  2. 共用还是单独使用要看具体情况,比如有两段代码都要使用线城池,其中一段代码被执行的次数非常多(你可以认为访问量很大), 那么另一段代码被执行的机会就会很小很小,这种情况你可以各自建一个线城池,用来隔离相互之间的影响

一楼正解,通常一个线程池是执行同一类任务的,会有专门的线程池管理类,来负责线程池的生命周期,至于什么时候shutdown,没有规定,
提示,shutdown只是说明不接受新任务,旧的线程仍然在跑,跑完了才关闭线程池;shutdownNow才是直接关闭线程池。