黑马程序员-线程池

来源:互联网 发布:程序员直播网站 编辑:程序博客网 时间:2024/04/29 16:04

------- android培训、java培训、期待与您交流! ----------

 

线程池概念:

  比如说某一个服务器访问量很大,不用线程池的时候就是有一个人去访问它就创建一个线程,结束后该线程也结束了,同时有成百上千的人访问就会有成百上千个线程被创建、销毁,在这个过程中不仅消耗时间还为服务器增加负担,如果人很多的情况下还有可能撑爆服务器。而线程池是一个池子里面先就预留了很多线程,这些线程在没有人访问的时候都处于休眠状态,一旦有请求线程池就会为其分配一个线程,请求结束后该线程不会被销毁也不会结束而是在线程池中继续等待线程池分配,如果服务端的请求超过了线程池中线程的数量那多余的求情将会等待,直到有已经连接上的请求结束才会有可能连接上,  这就是线程池,即不用重复的创建和销毁线程也把请求控制在了服务器的承受范围之内。

创建线程池:

  创建线程池要用到一个工具类:Executors

  然后调用该工具类的静态方法

    创建固定线程的线程池: Executors.newFixedThreadPool(3);传入的3表示在该固定线程池中创建3个线程。

    创建缓存线程池:Executors.newCachedThreadPool();有多少任务就有多少线程。内部线程是不定的。多余的线程会在一段时间后回收。

    创建单个线程池:Executors.newSignleThreadExecutor();该线程池中只有一个线程,且一直会有一个线程,也就是说这个线程池会一直保持有一个线程存在,即使当前线程死后也会马上又开启一个线程。

为线程池分配任务:

  execute(Runnable);该方法要求传出一个Runnable对象,也就是要执行的代码。如果为该线程池分配的任务少于线程池中的空闲线程数,则由这些空闲的线程抢任务,如果分配的任务数大于线程池中空闲的线程数则多余的任务会等待。

 

关闭线程池:

  shutdown();  在线程池中没有任何任务,且线程都空闲下来了就结束该线程池。

  shutdownNow(); 在执行到了该行代码就马上结束线程池,不会考虑是否还有任务是否没有执行完,如果该线程池中有线程在执行任务中被sleep()或者wait()了,被强制结束会抛出打断异常。

 1 public class ThreadPoolTest { 2  3     public static void main(String[] args) { 4          5          //缓存可变的线程池,有多少个任务就开多少个线程 6         //ExecutorService es = Executors.newCachedThreadPool(); 7         //固定的线程池,就只开启3个线程 8 //        ExecutorService es = Executors.newFixedThreadPool(3); 9         //单个线程,一直保持有一个线程,当一个线程死后会自动又开启一个线程10         ExecutorService es = Executors.newSingleThreadExecutor();11         for (int i = 1; i <= 10; i++) {12             final int task = i;13             //为线程池分配任务14             es.execute(new Runnable() {15 16                 @Override17                 public void run() {18                     19                     for (int j = 0; j < 10; j++) {20                 /*        try {21                             Thread.sleep(20);22                         } catch (InterruptedException e) {23                             e.printStackTrace();24                         }*/25                         System.out.println(Thread.currentThread().getName() + "---" +  j + "....." + task);26                     }27                 }28             });29         }30         //马上结束线程池,不管还有没有在执行的,这个方法也会打断冻结状态的线程,31         //es.shutdownNow();32         33         //所有线程执行完都关闭线程池34         es.shutdown();

 

定时线程池:

  newScheduledThreadPool(3);传入的3也是代表线程池中的线程数

为定时线程池分配任务:

  schedult(Runnable,time,unit); Runnable是代表要执行的代码,time表示延迟多久执行,unit代码延迟时间的单位,unit位置需要的是TimeUnit类的一个常量。

  scheduleAtFixedRate(Runnable,time1,time2,unit);在延迟的功能行加了循环循环延迟,time2处表示没延迟time2的时间就执行一次,不发生异常不被打断会一直执行下去。

TimeUnit类常量: 

  DAYS //天

  HOURS //小时

  MICROSECONDS //微秒

  MILLISECONDS //毫秒

  MINUTES //分钟

  NANOSECONDS //纳秒

  SECONDS//秒

 1         //定时线程池 3秒以后执行 2         ScheduledExecutorService ses = Executors.newScheduledThreadPool(3); 3         ses.schedule/*AtFixedRate*/(new Runnable(){ 4             @Override 5             public void run() { 6                 // TODO Auto-generated method stub 7                 System.out.println("bomb"); 8             } 9             //3的单位是秒10         }, 3, TimeUnit.SECONDS);

 

1         //定义等待两秒后执行,之后每隔3秒执行一次2         ses.scheduleAtFixedRate(new Runnable(){3             @Override4             public void run() {5                 // TODO Auto-generated method stub6                 System.out.println("bombing");7             }8             //等待两秒后执行,之后每隔3秒执行一次9         }, 2, 3, TimeUnit.SECONDS);

 

 

---恢复内容结束---

原创粉丝点击