Java 线程池和普通线程区别

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

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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖
  • 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

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

  • jonwinters 2

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

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

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

  • jonwinters

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

  • jonwinters

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

请输入回帖内容 ...

推荐标签 标签

  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖 • 34 关注
  • danl
    63 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 2 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖 • 1 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖
  • MyBatis

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

    170 引用 • 414 回帖 • 429 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    18709 引用 • 69852 回帖
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • 宕机

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

    13 引用 • 82 回帖 • 38 关注
  • CodeMirror
    1 引用 • 2 回帖 • 119 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 407 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 13 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 175 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖 • 1 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 565 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 40 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    284 引用 • 4481 回帖 • 654 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 623 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖
  • Gitea

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

    4 引用 • 16 回帖 • 1 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    131 引用 • 1114 回帖 • 151 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    275 引用 • 682 回帖
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    19 引用 • 31 回帖 • 2 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 6 关注