Executors类,提供了一系列工厂方法用于创建线程池,返回的线程池都实现了ExecutorService接口
java.util.concurrent.Executors
newCachedThreadPool() | -缓存型池子,先查看池中有没有以前建立的线程,如果有,就 reuse.如果没有,就建一个新的线程加入池中 -缓存型池子通常用于执行一些生存期很短的异步型任务 因此在一些面向连接的daemon型SERVER中用得不多。但对于生存期短的异步任务,它是Executor的首选。 -能reuse的线程,必须是timeout IDLE内的池中线程,缺省 timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池。 注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止。 |
newFixedThreadPool(int) |
参数:the number of threads in the pool |
newScheduledThreadPool(int) | -调度型线程池 -这个池子里的线程可以按schedule依次delay执行,或周期执行 |
SingleThreadExecutor() |
keepAliveTime = 0L |
代码示例:
public class ThreadDemo07 {
public static void main(String[] args) {
// 创建固定数量的线程池
ExecutorService service = Executors.newFixedThreadPool(5); //一池五线程
//ExecutorService service = Executors.newSingleThreadExecutor(); //一池单线程
//ExecutorService service = Executors.newCachedThreadPool(); //需要几个提供几个
Future<Integer> result = null; //Future是FutureTask的父类,此处用来接收线程的执行结果
try {
//模拟5个线程处理20个用户请求
for (int i = 1; i <=20; i++) {
把请求提交给线程池进行处理:
result=service.submit(new Callable<Integer>(){ //submit()方法的返回类型是Future
@Override
public Integer call() throws Exception {
System.out.print(Thread.currentThread().getName());
return new Random().nextInt(10); //这行的执行结果会给result,通过result获取
}
});
System.out.println("****:"+result.get()); //获取返回值
}
} catch (Exception e) {
e.printStackTrace();
} finally {
service.shutdown();
}
}
}
延迟调用:
public class ThreadDemo07 {
public static void main(String[] args) {
//延迟调度
ScheduledExecutorService service = Executors.newScheduledThreadPool(5);
ScheduledFuture<Integer> result = null;
try {
for(int i=1;i<=20;i++){
result = service.schedule(new Callable<Integer>(){
@Override
public Integer call() throws Exception {
System.out.print(Thread.currentThread().getName());
return new Random().nextInt(10);
}
}, 2, TimeUnit.SECONDS);//规定2秒钟后在返回,即2秒执行一次
System.out.println("****:"+result.get());
}
} catch (Exception e) {
e.printStackTrace();
}finally{
service.shutdown();
}
}
}