Java 线程池和普通线程区别

本贴最后更新于 3069 天前,其中的信息可能已经时移世易

Java 中线程池和原生线程貌似有点不一样,求解答。。。
下面附上两个 Demo 完成的功能是主线程等待所有子线程结束然后统计总耗时,第一个使用了线程池,第二个使用 Java 原生线程。

示例一:

import java.util.LinkedList; import java.util.List; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created on 2016/11/25 * * @author annpeter.it@gmail.com */public class Bootstrap { private static ExecutorService executorService = Executors.newFixedThreadPool(10); private static List list = new LinkedList<>(); private static Random random = new Random(); public static void main(String[] args) throws InterruptedException { long from = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { final int index = i; Runnable runnable = () -> { try { int time = random.nextInt(5000); Thread.sleep(time); System.out.println("i = " + index + " sleep: " + time); } catch (InterruptedException ignored) { // passed } }; Thread thread = new Thread(runnable); executorService.execute(thread); list.add(thread); } for (Thread thread : list) { System.out.println(thread.isAlive()); thread.join(); } long to = System.currentTimeMillis(); System.out.println("总用时: " + (to - from) ); } }

示例二:

import java.util.LinkedList; import java.util.List; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created on 2016/11/25 * * @author annpeter.it@gmail.com */public class Bootstrap { private static List list = new LinkedList<>(); private static Random random = new Random(); public static void main(String[] args) throws InterruptedException { long from = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { final int index = i; Runnable runnable = () -> { try { int time = random.nextInt(5000); Thread.sleep(time); System.out.println("i = " + index + " sleep: " + time); } catch (InterruptedException ignored) { // passed } }; Thread thread = new Thread(runnable); thread.start(); list.add(thread); } for (Thread thread : list) { System.out.println(thread.isAlive()); thread.join(); } long to = System.currentTimeMillis(); System.out.println("总用时: " + (to - from) ); } }
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3198 引用 • 8215 回帖
  • Thread
    3 引用 • 24 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    第一个用法不对吧,既然用了线程池,为什么还要 new Thread()

    1 回复
  • mainlove

    他这样用 也不算有问题, 这种 thread new 出来也不会去 start,只是用来 runable 的接口代码而已

    1 回复
  • mainlove 1

    lz 这样的测试意义不大
    lz 先去搜索下线程池解决了什么问题,然后再去测试,lz 这样测试说明了什么问题?好像看不出。。。

  • 88250

    我想暗示的是他姿势不对,导致了 join 没作用

    2 回复
  • mainlove 1

    有道理。。。

  • AnnPeter 1 via macOS

    哦 明白了 线程池实际上是 run 的 runable 的代码,join 的话必须要是一个线程对象,其实这边有两份线程对象,我 join 的那个线程对象不是线程池里面的线程对象。是这样吧 D 大。

  • jonwinters 2

    线程池主要是为了解决 大规模应用中线程复用的问题,因为创建线程,需要重新创建线程上下文 以及堆栈 PC 之类的,线程本身就是非常昂贵的资源开销,
    每一个新的线程都对应自己的线程栈,而且 Java 在 GC 的时候 需要暂停所有线程(不同 JVM 有自己的实现,这个不是绝对的),标记对象 进行回收,如果线程过多,GC 的时间就会相应增加 ,
    目前广泛采用的 GC root 算法,也就是针对所有的对象,形成一个无向图,然后进行一个图的搜索,如果所有线程的 当前 堆栈 本地方法栈 等都没有引用到这个对象的时候,这个对象就会被标记回收,

    小规模运用的话,用不用线程池 区别不大,因为创建线程开销相对较小,如果是亿级别的访问量,试问 tomcat 针对每一个 request 请求都进行一个线程创建,
    开销是十分巨大的,所以一般会采用动态线程池,根据并发访问量 来自动扩充工作线程。

    如果你的并发以及访问压力不大,例如一个手指头都 能搞定的话,线程池只是大材小用,如果并发量相当大的话,一般都会使用线程池

  • jonwinters

    另外楼主还要去补一补常见的 IO 模型,补完 IO 模型,你大概就能理解为什么要使用线程池了,

  • jonwinters

    说法出错了,GC root 是有向图,实际搜索算法 与 线程暂停 以及回收,各个 JVM 有不同的实现,这个需要参考虚拟机厂商的文档

请输入回帖内容 ...

推荐标签 标签

  • Outlook
    1 引用 • 5 回帖
  • OpenCV
    15 引用 • 36 回帖
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    367 引用 • 1844 回帖 • 2 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 29 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 3 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 814 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 294 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖 • 2 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 76 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 440 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 368 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 553 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 2 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    173 引用 • 518 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    184 引用 • 1015 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    151 引用 • 988 回帖
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 647 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    133 引用 • 796 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 316 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖 • 1 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    180 引用 • 408 回帖 • 489 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖 • 1 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖 • 1 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    22 引用 • 214 回帖 • 1 关注