标签:style blog io ar 使用 java for strong sp
一. 线程池的概念:
其实到目前为止我们接触过很多关于池的概念:string池、连接池,之所以要用这个池,目的只有一个:资源的重复使用。
线程池:首先创建一些线程,当服务器接收到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务完后并不关闭该线程,而是将该线程还回到线程池中。
在线程池的编程模式下,任务是提交给整个线程池的,而不是直接交给某个线程,线程池在拿到任务后,它就在内部找有无空闲的线程,找到后再把任务交给内部某个空闲的线程,这就是封装。记住:任务是提交给整个线程池的,一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。
二. 线程池的创建与关闭:
可以创建三种不同的线程池:
1. 创建固定大小的线程池
ExecutorService threadPool = Executors.newFixedThreadPool(3); // 线程数为3
2. 创建缓存线程池
ExecutorService threadPool = Executors.newCachedThreadPool();
3. 创建单一线程池
ExecutorService threadPool = Executors.newSingleThreadExecutor();
public class ThreadPoolTest {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newSingleThreadExecutor();
for (int i = 1; i <= 10; i++) {
final int task = i;
threadPool.execute(new Runnable() {
@Override
public void run() {
for (int j = 1; j <= 10; j++) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " is looping of " + j + " for task of " + task);
}
}
});
}
System.out.println("all of 10 takes have committed!!");
threadPool.shutdown();
}
}threadPool.shutdown()
threadPool.shutdownNow()
三. 用线程池启动定时器:
支持间隔重复任务的定时方式,不直接支持绝对定时方式,需要转换成相对时间方式:
public class TimerTest {
public static void main(String[] args) {
// 只爆炸一次的炸弹
Executors.newScheduledThreadPool(3).schedule(new Runnable() {
@Override
public void run() {
System.out.println("bombing!!!");
}
}, 4, TimeUnit.SECONDS);
// 会爆炸多次的连环炸弹
// 隔4秒炸一下,隔2秒再炸
Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("bombings!!!");
}
}, 4, 2, TimeUnit.SECONDS);
}
}标签:style blog io ar 使用 java for strong sp
原文地址:http://blog.csdn.net/zdp072/article/details/40423321