executors线程

来源:互联网 发布:淘宝网运动鞋女款秋冬 编辑:程序博客网 时间:2024/05/17 06:44

转自:http://hbiao68.iteye.com/blog/1929245


系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互。在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存周期很短的线程时,更应该考虑使用线程池。

 

使用线程池可以有效地控制系统中并发线程的数量,当系统中包含大量并发线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃,而线程池的最大线程数参数可以控制系统中并发线程数不超过此数。

 

从JAVA5开始新增了一个Executors工具类来产生线程池,它有如下几个静态工厂方法来创建线程池。

强烈建议程序员使用较为方便的 Executors 工厂方法 Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、

Executors.newFixedThreadPool(int)(固定大小线程池)

Executors.newSingleThreadExecutor()(单个后台线程)

Executors.newScheduledThreadPool(int corePoolSize) 可以指定延迟后执行线程任务。

 

ExecutorService代表尽快执行线程的线程池(只要线程池中有空闲的线程,就立即执行线程任务),程序只要将一个Runnable对象或Callable对象(代表线程任务)提交给该线程,该线程就会尽快执行该任务

 

当用完一个线程池后,应该嗲用该线程池的shutdown()方法,该方法将启动线程池的关闭序列,调用shutdown()方法后的线程池不再接受新任务,但将以前所有已提交任务执行完。当线程池中的所有任务都执行完成后,池中的所有线程都会死亡;另外也可以调用线程池中的shutdownNow()方法来关闭线程池,该方法试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行任务列表。

 

Java代码  收藏代码
  1. package hb.threadpool;  
  2.   
  3. import java.util.concurrent.ExecutorService;  
  4. import java.util.concurrent.Executors;  
  5. import java.util.concurrent.TimeUnit;  
  6.   
  7. public class FixedThreadPoolDemo {  
  8.   
  9.     public static void main(String[] args) {  
  10.           
  11.         ExecutorService es = Executors.newFixedThreadPool(2);  
  12. //      ExecutorService es = Executors.newCachedThreadPool();  
  13.           
  14.         for (int i = 0; i < 10; i++) {  
  15.             final int count = i;  
  16.             //过两秒启动线程运行里面的run方法  
  17.             es.submit(new Runnable() {  
  18.                 @Override  
  19.                 public void run() {  
  20.                     System.out.println(Thread.currentThread().getName() + "----------" + count);  
  21.                     try {  
  22.                         Thread.sleep(1000);  
  23.                     } catch (InterruptedException e) {  
  24.                         e.printStackTrace();  
  25.                     }  
  26.                 }  
  27.             });  
  28.         }  
  29.           
  30.         System.out.println(es.isShutdown());  
  31.         //等待线程运行完毕之后再停止线程。  
  32.         es.shutdown();  
  33.         //强制停止线程,如果当前线程正在执行,则被强制停止。  
  34. //      es.shutdownNow();  
  35.         System.out.println(es.isShutdown());  
  36.           
  37.     }  
  38.   
  39. }  
  40.    

 

Java代码  收藏代码
  1. package hb.threadpool;  
  2.   
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.ScheduledExecutorService;  
  5. import java.util.concurrent.ScheduledThreadPoolExecutor;  
  6. import java.util.concurrent.TimeUnit;  
  7.   
  8. public class ScheduledThreadPoolExecutorDemo {  
  9.   
  10.     public static void main(String[] args) {  
  11.   
  12. //      ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(2);  
  13.         ScheduledExecutorService stpe = Executors.newScheduledThreadPool(2);;  
  14.           
  15.         for (int i = 0; i < 10; i++) {  
  16.             final int count = i;  
  17.             //过两秒启动线程运行里面的run方法  
  18.             stpe.schedule(new Runnable() {  
  19.                 @Override  
  20.                 public void run() {  
  21.                     System.out.println(Thread.currentThread().getName() + "----------" + count);  
  22.                     try {  
  23.                         Thread.sleep(1000);  
  24.                     } catch (InterruptedException e) {  
  25.                         e.printStackTrace();  
  26.                     }  
  27.                 }  
  28.             }, 2, TimeUnit.SECONDS);  
  29.         }  
  30.           
  31.         System.out.println(stpe.isShutdown());  
  32.         //等待线程运行完毕之后再停止线程。  
  33.         stpe.shutdown();  
  34.         //强制停止线程,如果当前线程正在执行,则被强制停止。  
  35. //      stpe.shutdownNow();  
  36.         System.out.println(stpe.isShutdown());  
  37.           
  38.   
  39.     }  
  40.   
  41. }  

0 0