java线程池
2017-08-28 本文已影响12人
小炉炉
java的线程基于Eexecutor异步框架的四种线程池,至于什么是Executor异步框架,请移驾:http://www.cnblogs.com/MOBIN/p/5436482.html
newSingleThreadExecutor: 这个是单线程化的线程池,他只会用唯一的线程来工作以保证所有的任务按照指定的顺序进行(FIFO,LIFO,优先级)执行。
newScheduledThreadPool: 这是一个定长线程池,支持定时以及定周期性的任务执行。
newFixedThreadPool:创建一个定长的线程池,可控制线程的最大并发数量,超出线程最大并发数量的会在队列中进行等待
newCachedThreadPool:创建一个可缓存的线程池,如果线程池长度超过处理需要,可以灵活回收空闲线程,若无可回收,则新建线程。
/**
* @Title: TheThreadPool.java
* @Prject: ThreaTest
* @Package: com.zhiyou
* @Description: TODO
* @author: Liu Hao
* @date: 2017年8月28日 下午5:11:10
* @version: V1.0
*/
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @ClassName: TheThreadPool
* @Description: 这个几个线程池都是通过Executors创建的。
* @author: Liu Hao
* @date: 2017年8月28日 下午5:11:10
*/
public class TheThreadPool {
public static void main(String[] args) {
TheThreadPool t = new TheThreadPool();
t.newSingleThreadExecutor();
t.newScheduledThreadPool();
t.newFixedThreadPool();
}
/*
* 单线程化的线程池:它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
*/
public void newSingleThreadExecutor(){
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index =i;
singleThreadPool.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
/*
* 创建一个定长线程池,支持定时及周期性任务执行
*/
public void newScheduledThreadPool(){
// 表示延迟1秒执行,每隔3秒执行一次
ScheduledExecutorService ses = Executors.newScheduledThreadPool(5);
ses.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("表示延迟1秒执行,每隔3秒执行一次");
}
}, 1, 3, TimeUnit.SECONDS);
}
/*
* 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
*/
public void newFixedThreadPool(){
//
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index=i;
executorService.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
System.out.println(index);
Thread.sleep(index);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
/*
* 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
*/
public void newCachedThreadPool(){
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index=i;
try {
Thread.sleep(index*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//第一个线程结束之后,创建的第二个线程还可以使用之前创建的线程,节约资源。
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(index);
}
});
}
}
}
小弟也是初次学习,如果有哪些不正确的请指出。