zoukankan      html  css  js  c++  java
  • 线程学习四:线程池

    Java通过Executors提供四种线程池,分别为:

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

    一、newCachedThreadPool

     1 public class NewCachedThreadPool {
     2     public static void main(String[] args) throws InterruptedException {
     3         ExecutorService es = Executors.newCachedThreadPool();
     4         RunnableTest1 rt = new RunnableTest1();
     5         es.execute(rt);
     6         Thread.sleep(2000);
     7         System.out.println("sleep finish");
     8         es.execute(rt);
     9     }
    10 }
    11 
    12 class RunnableTest1 implements Runnable {
    13     public void run() {
    14         for (int i = 0; i < 100; i++) {
    15             System.out.println(Thread.currentThread().getName() + "...." + i);
    16         }
    17     }
    18 }

    如果上一个任务已经使用线程完毕,下一个任务会调用之前的线程,不会再创建;如果任务没有完毕,会创建新线程。

    二、newFixedThreadPool

     1 public class NewFixedThreadPool {
     2     public static void main(String[] args) throws InterruptedException {
     3         ExecutorService es = Executors.newFixedThreadPool(2);
     4         RunnableTest rt = new RunnableTest();
     5         es.execute(rt);
     6         Thread.sleep(2000);
     7         System.out.println("sleep finish");
     8         es.execute(rt);
     9     }
    10 }
    11 
    12 class RunnableTest implements Runnable {
    13     public void run() {
    14         for (int i = 0; i < 100; i++) {
    15             System.out.println(Thread.currentThread().getName() + "...." + i);
    16         }
    17     }
    18 }

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

    三、newScheduledThreadPool

     1 public class NewScheduledThreadPool {
     2     public static void main(String[] args) {
     3         ScheduledExecutorService es = Executors.newScheduledThreadPool(2);
     4         RunnableTest2 rt = new RunnableTest2();
     5         es.scheduleAtFixedRate(rt, 0, 3, TimeUnit.SECONDS);
     6         es.execute(rt);
     7     }
     8 }
     9 
    10 class RunnableTest2 implements Runnable {
    11     public void run() {
    12         for (int i = 0; i < 100; i++) {
    13             System.out.println(Thread.currentThread().getName() + "...." + i);
    14         }
    15     }
    16 }

    可以设置线程的延迟时间以及隔多久执行一次,注意这里是调用ScheduledExecutorService的scheduleAtFixedRate()方法,与其他线程池不同。

    四、newSingleThreadScheduledExecutor

     1 public class NewSingleThreadExecutor {
     2     public static void main(String[] args) {
     3         ExecutorService es = Executors.newSingleThreadScheduledExecutor();
     4         RunnableTest3 rt = new RunnableTest3();
     5         es.execute(rt);
     6         es.execute(rt);
     7     }
     8 }
     9 
    10 class RunnableTest3 implements Runnable {
    11     public void run() {
    12         for (int i = 0; i < 100; i++) {
    13             System.out.println(Thread.currentThread().getName() + "...." + i);
    14         }
    15     }
    16 }

    会将并行的线程按一定排序串行执行。

    五、线程池关闭

    我们可以通过调用线程池的shutdown或shutdownNow方法来关闭线程池,它们的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无法响应中断的任务可能永远无法终止。但是它们存在一定的区别,shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。

    只要调用了这两个关闭方法的其中一个,isShutdown方法就会返回true。当所有的任务都已关闭后,才表示线程池关闭成功,这时调用isTerminaed方法会返回true。至于我们应该调用哪一种方法来关闭线程池,应该由提交到线程池的任务特性决定,通常调用shutdown来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow。

  • 相关阅读:
    城市社会经济专项规划之生态产业规划
    土地资源承载力研究
    生态功能区划方法之三:聚类分析法和生态融合法
    生态功能区划综述
    生态功能区划及生态规划的重要内容:生态环境现状评价
    生态功能区划方法之一:生态敏感性分析法
    生态环境专项规划
    城市社会经济专项规划之生态人居规划
    城市生态规划关键技术方法之五:生态支持系统瓶颈分析方法
    环境容量研究
  • 原文地址:https://www.cnblogs.com/gforce/p/5909691.html
Copyright © 2011-2022 走看看