我自己开发了一套软件,以多线程方式运行,线程种类分为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());
}请问为什么两种方式居然没有任何区别,线程创建于销毁的时间是不是可以忽略不计?
属于线程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());
}请问为什么两种方式居然没有任何区别,线程创建于销毁的时间是不是可以忽略不计?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货