新手?没做过多线程实践?来,其实很简单,看完秒会( 三 )


大概的方式有以下几种:
新手?没做过多线程实践?来,其实很简单,看完秒会文章插图
这里我们使用线程池的方式:
在停用线程池后加上一个判断条件即可:
executorService.shutdown();while (!executorService.awaitTermination(100, TimeUnit.MILLISECONDS)) { logger.info("worker running");}long total = totalWords.total();long end = System.currentTimeMillis();logger.info("total sum=[{}],[{}] ms",total,end-start);这样我们再次尝试 , 发现无论多少次结果都是正确的了:
新手?没做过多线程实践?来,其实很简单,看完秒会文章插图
效率提升可能还会有朋友问 , 这样的方式也没见提升多少效率啊 。
这其实是由于我本地文件少 , 加上一个文件处理的耗时也比较短导致的 。
甚至线程数开的够多导致频繁的上下文切换还是让执行效率降低 。
为了模拟效率的提升 , 每处理一个文件我都让当前线程休眠 100 毫秒来模拟执行耗时 。
先看单线程运行需要耗时多久 。
新手?没做过多线程实践?来,其实很简单,看完秒会文章插图
总共耗时:[8404] ms
接着在线程池大小为 4 的情况下耗时:
新手?没做过多线程实践?来,其实很简单,看完秒会文章插图
新手?没做过多线程实践?来,其实很简单,看完秒会文章插图
总共耗时:[2350] ms
可见效率提升还是非常明显的 。
更多思考这只是多线程其中的一个用法 , 相信看到这里的朋友应该多它的理解更进一步了 。
再给大家留个阅后练习 , 场景也是类似的:
在 Redis 或者其他存储介质中存放有上千万的手机号码数据 , 每个号码都是唯一的 , 需要在最快的时间内把这些号码全部都遍历一遍 。
有想法感兴趣的朋友欢迎在文末留言参与讨论 。
总结希望看完的朋友心中能对文初的几个问题能有自己的答案:

  • 为什么需要多线程?
  • 怎么实现一个多线程程序?
  • 多线程带来的问题及解决方案?
文中的代码都在此处 。
作者:crossoverJie链接:来源:掘金