我自己开发了一套软件,以多线程方式运行,线程种类分为2类线程,线程Diagram,和线程Pic,线程Pic由Diagram生成,数量不定(平均有10个左右),线程Diagram数量大概会有几百到上万,线程Diagram访问SQL Server数据库,把数据分发给各个线程Pic,最后要汇总线程Pic的结果并进行文件存储。
属于线程Diagram的所有线程Pic会由其主线程Diagram进行CountDownLatch同步,大部分线程Pic之间无需同步,仅有极少数的线程Pic相互之间需要同步。
最开始采用Diagram.start,Pic.start方式运行(无线程池),后来改为无界队列线程池(线程Diagram和线程Pic各自有一个独立的线程池,Diagram的核心线程数大概为80,Pic的核心线程数大概为300)运行,由其他同步程序控制线程Diagram和线程Pic的生成速率,防止队列过长导致系统崩溃。
两种方式运行的结果是时间几乎一样(测试时,JDK7, win10,物理内存8GB,Intel Core i5-8350U CPU1.7GHz,线程Diagram数量大概为1050,所有的线程Pic数量大概为8600, 结果两种方式总的运行时间均为686秒)if (useThreadPool) {
                    ThreadPoolPic = new ThreadPoolExecutor(Diagram.MaxThreads, Diagram.MaxThreads, 10000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());                                        ThreadPoolDiagram = new ThreadPoolExecutor(diagram_MaxThreads, diagram_MaxThreads, 10000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
                }请问为什么两种方式居然没有任何区别,线程创建于销毁的时间是不是可以忽略不计?

解决方案 »

  1.   

    首先要知道为什么要用线程池,因为创建线程本身是比较重的,所以如果是需要频繁创建线程和销毁线程的程序,则通过线程池能够提升性能。但是如果创建线程所消耗的时间与线程本身的执行时间相比可以忽略时,则线程池提升不了什么性能。其实不要说线程池有时候提升不了性能,甚至很多时候多线程也提升不了性能,有时候会发现单线程与多线程性能几乎没有区别。这又需要考虑你的程序属于什么类型,是属于高CPU程序还是大量IO的程序等。具体问题需要具体分析。
      

  2.   

    看来是这样了,我的两类线程都要读数据库,Diagram线程需要写文件。在这种情况下,最早采用单线程时,确实性能很差。后改为多线程,性能极大提升。原本以为线程创建的负荷很大,现在看来,相比我的业务逻辑并不是主要因素。谢谢了。