Java_多线程(线程池 )

作者: Miss_差不多 | 来源:发表于2017-09-23 15:00 被阅读39次

线程池

我们在项目中往往会创建线程以方便使用,但如果在并发的线程数量多,并每个线程都执行一个时间很短的任务就结束时,就会频繁的创建线程,这样会降低系统的效率拖慢运行时间.在java中我们有更好的办法来实现这样的效果,就是线程池.

利用线程池的好处:

  • 降低资源的消耗,通过重复利用已创建的线程降低线程创建和销毁造成的销毁.
  • 提高响应速度,当任务到达时,任务可以不需要等线程创建就能立即执行.
  • 提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配.

java通过EXecutors提供了四种线程池

  • newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则创建新线程.
  • newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待.
  • newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行.
  • newSingleThreadExecutor创建一个单程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行.
newCachedThreadPool

java代码

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;


public class Test1 {
   public static void main(String[] args) throws InterruptedException {
      Executor ex = Executors.newCachedThreadPool();
      
      for (int i = 0; i < 10; i++) {
          final int index = i;
        Thread.sleep(index * 1000);
         new Thread(new Runnable() {
                
                @Override
                public void run() {
                    System.out.println("线程1");
                    
                }
            }).start();
             new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        System.out.println("线程2");
                        
                    }
                }).start();
             ex.execute(new Runnable() {
                
                @Override
                public void run() {
                
                 synchronized (this) {
                     System.out.println("线程三");
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    notifyAll();
                }
                    
                }
            });
    }
    }
}

线程1
线程2
线程三
线程1
线程2
线程三

newFixedThreadPool
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

//线程池  防止频繁的创建线程  减少
public class Test3 {
    public static void main(String[] args) {
             //创建线程池
        Executor ec = Executors.newFixedThreadPool(3);//int  线程池中保留的个数
        ec.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程1");
                
            }
        });
        ec.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程2");
                
            }
        });
        
        }
}

newScheduledThreadPool
    package test;  
    import java.util.concurrent.Executors;  
    import java.util.concurrent.ScheduledExecutorService;  
    import java.util.concurrent.TimeUnit;  
    public class ThreadPoolExecutorTest {  
     public static void main(String[] args) {  
      ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  
      scheduledThreadPool.schedule(new Runnable() {  
       public void run() {  
        System.out.println("delay 3 seconds");  
       }  
      }, 3, TimeUnit.SECONDS);  
     }  
    }  

结果延迟3秒执行.

newSingleThreadExecutor
    package test;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    public class ThreadPoolExecutorTest {  
     public static void main(String[] args) {  
      ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();  
      for (int i = 0; i < 10; i++) {  
       final int index = i;  
       singleThreadExecutor.execute(new Runnable() {  
        public void run() {  
         try {  
          System.out.println(index);  
          Thread.sleep(2000);  
         } catch (InterruptedException e) {  
          e.printStackTrace();  
         }  
        }  
       });  
      }  
     }  
    }  

结果一次输出,相当于顺序执行.

  • corePoolSize 核心池的大小,基本大小,即在没有任务需要执行的时候线程池的大小
  • maximunPoolSize 线程池最大线程数 表示在线程池中最多能创建多少个线程.线程中当前线程数目不会超过这个值.

相关文章

  • Java_多线程(线程池 )

    线程池 我们在项目中往往会创建线程以方便使用,但如果在并发的线程数量多,并每个线程都执行一个时间很短的任务就结束时...

  • Thread

    队列 线程锁 多线程,线程池 队列 多线程爬虫示例 多线程 自定义线程 线程池

  • java_多线程

    java_多线程 线程创建方式;join用法; sleep和wait区别; 线程安全和不安全的java集合; St...

  • Java:线程池Executors.newFixedThread

    摘要:Java,多线程,线程池 多线程编程和线程池概述 (1)多线程程序: 计算机可以实现多任务 ( multit...

  • 10.3多线程详解

    Java高级-多线程 多线程创建 多线程通讯 线程池 1.多线程创建 thread/runnable图:继承Thr...

  • Springboot | 线程池的学习,多线程池配置示例

    一、线程和进程,线程的生命周期二、单线程和多线程三、线程池的概念四、线程池的使用五、多线程池配置示例 一、线程和进...

  • java_线程池

    Executors 四种线程池 newFixedThreadPool(int var0)固定线程数, 使用了Lin...

  • Java_多线程

    线程概述 进程 是程序的一次动态执行 对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己...

  • Java_多线程

    1.知识点: 1.介绍多线程2.线程安全 2.知识点的运用: 1.多线程的作用: 发挥多核CPU的优势,充分利用C...

  • 反射、注解与依赖注入总结

    上一篇【线程、多线程与线程池总结】中主要记录线程、多线程相关概念,侧重于线程的Future使用与线程池的操作;同样...

网友评论

    本文标题:Java_多线程(线程池 )

    本文链接:https://www.haomeiwen.com/subject/ppgxextx.html