读书人

JAVA 线程池并发性能有关问题(代码有

发布时间: 2012-05-02 15:36:04 作者: rapoo

JAVA 线程池并发性能问题(代码问题?)

Java code
public class CommentsThreadUtil {    @Autowired    private GetFeedCommentsService getFeedCommentsService;    private static final Log LOGGER = LogFactory            .getLog(CommentsThreadUtil.class);        private static final int THREADNUM = Runtime.getRuntime()            .availableProcessors() * 10;    private static final long TIMEOUT = 100;    ExecutorService threadPool = Executors.newFixedThreadPool(THREADNUM);    @Profiled    public void excute(int host, List<MatterFeedData> matterFeedDatas,            ProcessMatterCommentBuilder processMatterCommentBuilder) {        for (MatterFeedData matterFeedData : matterFeedDatas) {            threadPool.execute(new SimpleThread(host, matterFeedData,                    processMatterCommentBuilder));        }        try {            if (!threadPool.awaitTermination(TIMEOUT, TimeUnit.MILLISECONDS)) {                if (LOGGER.isInfoEnabled()) {                    LOGGER.info("timeout:" + host                            + ",matterFeedData=" + matterFeedDatas);                }            }        } catch (InterruptedException e) {            // threadPool.shutdownNow();            LOGGER.error("取评论线程池执行出错:host=" + host, e);        }    }    class SimpleThread implements Runnable {        private int host;        private MatterFeedData matterFeedData;        private ProcessMatterCommentBuilder processMatterCommentBuilder;        public SimpleThread(int host, MatterFeedData matterFeedData,                ProcessMatterCommentBuilder processMatterCommentBuilder) {            this.host = host;            this.matterFeedData = matterFeedData;            this.processMatterCommentBuilder = processMatterCommentBuilder;        }        @Override        public void run() {            List<MatterComment> matterComments = getFeedCommentsService                    .getFeedComments(host, matterFeedData.getUgcInfo(),                            processMatterCommentBuilder);            matterFeedData.setMatterComments(matterComments);        }    }}



如上代码,下面每个线程执行时间10ms,但是为什么线程池中每次execute执行是102左右ms,每次调用execute方法,参数list大小为10,即每次并发10个线程。

为什么用了线程池,时间和串行10个线程没区别?

[解决办法]
不知道你的run中是什么类型的任务,是IO密集型还是计算密集型

以及IO与计算的比例

如果是纯计算密集型,线程数超过CPU数就可能降低性能了

最佳线程数大概可以这么算 = CPU(核)数/(1-阻塞率)

阻塞率是需要观察计算得到的

读书人网 >J2EE开发

热点推荐