1、new Thread的弊端

  1. new Thead(new Runnable(){
  2. @Override
  3. public void run() {
  4. // TODO Auto-generated method stub
  5. }
  6. }).start();
  1. new 线程弊端:
    1. 每次new Thread新建对象性能差。
    2. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom
    3. 缺乏更多功能,如定时执行、定期执行、线程中断。
  2.  
  3. 线程池好处:
    1. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
    2. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
    3. 提供定时执行、定期执行、单线程、并发数控制等功能。
  4.  
  5. 2. 线程池 (4 种)
    Java通过Executors提供四种线程池,分别为:
    1. newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,
    若无可回收,则新建线程。
    2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    3. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
    4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,
    保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
  6. (1). newCachedThreadPool
    创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:
  1. new Thead(new Runnable(){
  2. @Override
  3. public void run() {
  4. // TODO Auto-generated method stub
  5. }
  6. }).start();
  1. 线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

(2). newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

  

  1. ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
  2. for (int i = 0; i < 10; i++) {
  3. final int index = i;
  4. fixedThreadPool.execute(new Runnable() {
  5.  
  6. @Override
  7. public void run() {
  8. try {
  9. System.out.println(index);
  10. Thread.sleep(2000);
  11. } catch (InterruptedException e) {
  12. // TODO Auto-generated catch block
  13. e.printStackTrace();
  14. }
  15. }
  16. });
  17. }

     因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。

可参考PreloadDataCache。

(3) newScheduledThreadPool

创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下(表示延迟3秒执行):      

  1. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
  2. scheduledThreadPool.schedule(new Runnable() {
  3.  
  4. @Override
  5. public void run() {
  6. System.out.println("delay 3 seconds");
  7. }
  8. }, 3, TimeUnit.SECONDS);

定期执行示例代码如下:

  1. scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
  2.  
  3. @Override
  4. public void run() {
  5. System.out.println("delay 1 seconds, and excute every 3 seconds");
  6. }
  7. }, 1, 3, TimeUnit.SECONDS);

       表示延迟1秒后每3秒执行一次。

ScheduledExecutorService比Timer更安全,功能更强大,后面会有一篇单独进行对比。

(4)、newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,

保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:        

  1. ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
  2. for (int i = 0; i < 10; i++) {
  3. final int index = i;
  4. singleThreadExecutor.execute(new Runnable() {
  5.  
  6. @Override
  7. public void run() {
  8. try {
  9. System.out.println(index);
  10. Thread.sleep(2000);
  11. } catch (InterruptedException e) {
  12. // TODO Auto-generated catch block
  13. e.printStackTrace();
  14. }
  15. }
  16. });
  17. }

结果依次输出,相当于顺序执行各个任务。

       总结说明:

现行大多数GUI程序都是单线程的。Android中单线程可用于数据库操作,文件操作,应用批量安装。

应用批量删除等不适合并发但可能IO阻塞性及影响UI线程响应的操作。

  1.  

Java ExecutorService 四种线程池的更多相关文章

  1. Java ExecutorService四种线程池的例子与说明

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  2. Java ExecutorService四种线程池的例子与说明(转发)

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  3. Java ExecutorService四种线程池及自定义ThreadPoolExecutor机制

    一.Java 线程池 Java通过Executors提供四种线程池,分别为:1.newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收 ...

  4. Java 1.ExecutorService四种线程池的例子与说明

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  5. Java并发编程:Java的四种线程池的使用,以及自定义线程工厂

    目录 引言 四种线程池 newCachedThreadPool:可缓存的线程池 newFixedThreadPool:定长线程池 newSingleThreadExecutor:单线程线程池 newS ...

  6. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  7. Java四种线程池的使用

    Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...

  8. Java四种线程池

    Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...

  9. Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void ru ...

随机推荐

  1. 【原】Coursera—Andrew Ng机器学习—Week 2 习题—Linear Regression with Multiple Variables 多变量线性回归

    Gradient Descent for Multiple Variables [1]多变量线性模型  代价函数 Answer:AB [2]Feature Scaling 特征缩放 Answer:D ...

  2. 字节流之文件输入流FileInputStream

  3. zookeeper更进一步(数据模型、watcher及shell命令)

    ZooKeeper数据模型 ZooKeeper 的数据模型,在结构上和标准文件系统的非常相似,拥有一个层次的命名空间,都是采用树形层次结构,ZooKeeper 树中的每个节点被称为—Znode.和文件 ...

  4. 【bzoj1056】排名系统

    1056: [HAOI2008]排名系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2195  Solved: 623[Submit][Statu ...

  5. SSH隧道技术简介

    本文的受众如果你遇到了以下问题,那么你应该阅读这篇文章 我听说过这种技术,我对它很感兴趣 我想在家里访问我在公司的机器(写程序,查数据,下电影). 公司为了防止我们用XX软件封锁了它的端口或者服务器地 ...

  6. ThinkPHP3.2 插入数据库数据,缓存问题

    每个字段都是有数据的,可是就是is_new插不进去, 最后的原因就是TP有数据库字段缓存,FUCK 把RunTIme下面的Data文件夹删除掉,在开发模式中就把自动缓存改成Fasle

  7. javascript-文档结构遍历

    1.document.all document.all[0] //文档中第一个元素 document.all["navbar"] //id或name为"navbar&qu ...

  8. ubuntu18.04 蓝牙打开无效,解决办法升级内核

    http://kernel.ubuntu.com/~kernel-ppa/mainline/ 上面的链接是linux内核版本, 蓝牙不管用可能是linux内核版本过低,本人亲自实验过, 升级到4.20 ...

  9. the install of mysql in Linux System

    一.下载MySql 浏览器打开 https://www.mysql.com/downloads/mysql/#downloads 下载 我下载的版本是Red Hat 5 版本的 https://www ...

  10. 使用EasyUI,关于日期格式的文本框按照正常方式获取不到值的问题

    这是个小菜在实际工作中遇到的问题,相信很多EasyUI新手很可能也遇到这样的问题,因此小菜觉得有必要拿出来分享一下. 这个问题要从EasyUI的datebox组件说起,小菜用这个组件的时候,发现用$( ...