您的位置:首页 > 编程语言 > Java开发

Java的四种线程池的使用

2017-05-23 11:00 246 查看
Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程

newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在

队列中等待。newScheduledThreadPool创建一个定长线程池,支持定时和周期性任务执行

。newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。

 

(1)newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程示例代码如下:

的Java代码  




包装 测试;  
import  java.util.concurrent.ExecutorService;  
import  java.util.concurrent.Executors;  
公共类 ThreadPoolExecutorTest {   
 public static
void  main(String [] args){    
  ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
  for  (int
 i =  0 ; i <  10
; i ++){  
   final int
 index = i;   
   尝试 {  
    Thread.sleep(index *  1000 );  
   }  catch  (InterruptedException e){  
    e.printStackTrace();  
   }  
   cachedThreadPool.execute(new  Runnable(){  
    public void
 run(){   
     的System.out.println(索引);  
    }  
   });  
  }  
 }  
}  

包装测试;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
public static void main(String [] args){
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for(int i = 0; i <10; i ++){
final int index = i;
尝试{
Thread.sleep(index * 1000);
} catch(InterruptedException e){
e.printStackTrace();
}
cachedThreadPool.execute(new Runnable(){
public void run(){
的System.out.println(索引);
}
});
}
}
}

 

线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

 
(2)newFixedThreadPool

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

的Java代码  




包装 测试;  
import  java.util.concurrent.ExecutorService;  
import  java.util.concurrent.Executors;  
公共类 ThreadPoolExecutorTest {   
 public static
void  main(String [] args){    
  ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3
);  
  for  (int
 i =  0 ; i <  10
; i ++){  
   final int
 index = i;   
   fixedThreadPool.execute(new  Runnable(){  
    public void
 run(){   
     尝试 {  
      的System.out.println(索引);  
      Thread.sleep(2000 );  
     }  catch  (InterruptedException e){  
      e.printStackTrace();  
     }  
    }  
   });  
  }  
 }  
}  

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

 

因为线程池大小为3,每个任务输出索引后睡眠2秒,所以每两秒打打3个数字。

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

 

(3)newScheduledThreadPool

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

的Java代码  




包装 测试;  
import  java.util.concurrent.Executors;  
import  java.util.concurrent.ScheduledExecutorService;  
import  java.util.concurrent.TimeUnit;  
公共类 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);  
 }  
}  

package test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import jav
cb5c
a.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秒执行。

定期执行示例代码如下:

的Java代码  




包装 测试;  
import  java.util.concurrent.Executors;  
import  java.util.concurrent.ScheduledExecutorService;  
import  java.util.concurrent.TimeUnit;  
公共类 ThreadPoolExecutorTest {   
 public static
void  main(String [] args){    
  ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5
);  
  scheduledThreadPool.scheduleAtFixedRate(new
 Runnable(){  
   public void
 run(){   
    System.out.println(“延迟1秒,每3秒排除一次”
);  
   }  
  },  1 ,  3
,TimeUnit.SECONDS);  
 }  
}  

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.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);
}
}

 

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

 

(4)newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。示例代码如下:

的Java代码  




包装 测试;  
import  java.util.concurrent.ExecutorService;  
import  java.util.concurrent.Executors;  
公共类 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(){   
     尝试 {  
      的System.out.println(索引);  
      Thread.sleep(2000 );  
     }  catch  (InterruptedException e){  
      e.printStackTrace();  
     }  
    }  
   });  
  }  
 }  
}  

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();
}
}
});
}
}
}

 

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

你可以使用JDK自带的监控工具来监控我们创建的线程数量,运行一个不终止的线程,创建指定量的线程,来观察:

工具目录:C:\ Program Files \ Java \ jdk1.6.0_06 \ bin \ jconsole.exe

运行程序做稍微修改:

的Java代码  




包装 测试;  
import  java.util.concurrent.ExecutorService;  
import  java.util.concurrent.Executors;  
公共类 ThreadPoolExecutorTest {   
 public static
void  main(String [] args){    
  ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();  
  for  (int
 i =  0 ; i <  100
; i ++){  
   final int
 index = i;   
   singleThreadExecutor.execute(new  Runnable(){  
    public void
 run(){   
     尝试 {  
      while (true
){  
       的System.out.println(索引);  
       Thread.sleep(10  *  1000
);  
      }  
     }  catch  (InterruptedException e){  
      e.printStackTrace();  
     }  
    }  
   });  
   尝试 {  
    Thread.sleep(500 );  
   }  catch  (InterruptedException e){  
    e.printStackTrace();  
   }  
  }  
 }  
}  

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

 

效果如下:

 


选择我们运行的程序:



监控运行状态

 

 

请你到ITEYE网站看java小强原创,谢谢!

http://cuisuqiang.iteye.com/ !

自建博客地址:http :
//www.javacui.com/,内容与ITEYE同步!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: