简介
在jdk1.5之前java的多线程方面是很弱的,自jdk1.5开始增加了一个java.util.concurrent包,该包下都是操作多线程的并发库。
线程池的作用
在java中,如果请求到了就为其开启一个线程,频繁开启和销毁一个线程是非常占用资源的,系统开销很大,于是就有了新技术--线程池,在传统的线程中,开启一个线程只能为其分配 一个线程任务,任务运行完了线程也就要死了,线程池能够”循环“运行任务,增加一个线程任务,不再是交给线程去运行,而是交给一个线程池去运行。如果线程池繁忙那就等待。这样可以限制系统中线程的数量。
为什么要使用线程池
1.减少频繁开启和销毁线程,多个工作线程可以重复使用,可以次运行任务。
2.可以限制系统中线程的数量,可以根据系统自身的配置来手动设置线程的数量。避免许多问题。
三种创建线程池的方法
ExecutorService threadPool= Executors.newCachedThreadPool();//创建缓存线程池
threadPool=Executors.newSingleThreadExecutor();//创建单例线程池
threadPool=Executors.newFixedThreadPool(10);//创建固定大小线程池。
for(int i=1;i<=10;i++){
final int task =i;
threadPool.execute(
new Runnable(){
@Override
public void run() {
for(int i =1;i<=10;i++){
System.out.println(Thread.currentThread().getName()+" is looping of "+i+", task of "+ task);
}
}});
}
threadPool.shutdown();//关闭线程池
另外还有个定时器:
//定义器
Executors.newScheduledThreadPool(3).schedule(
new Runnable(){
@Override
public void run() {
System.out.println("bombing !");
}},
10,
TimeUnit.SECONDS
);
Executors.newScheduledThreadPool(3).scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
System.out.println("bombing !");
}},
2,
4,
TimeUnit.SECONDS);