线程池:将线程资源进行限制,比如FixedThreadPool(3)定义3个线程资源对线程进行管理,若多余3个则需要等其中一个完成才能进去开始任务。1.开启线程的消耗比较大,使用线程池相当于给了一个有n个线程的集合需要时直接拿,用完直接放回,大大减小了系统消耗。2.若线程中有线程发生阻塞,还能使用其他线程进行任务,而不至于都在等待排列。
package ThreadPractice;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by qiaorenjie on 2018/3/28.
*/
public class ThreadPoolTest {
public static void main(String[] args) {
//1.固定线程池
ExecutorService threadPool = Executors.newFixedThreadPool(3);
//2.缓存线程池 随线程数增加而增加,若减少则一段时间后会自动清理掉
// ExecutorService threadPool = Executors.newCachedThreadPool();
//3.单个线程池 若线程消亡,会再开启一个,总是保证有一个线程
// 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()+" 循环次数: "+j + " 任务数: "+ task);
}
}
});
}
System.out.println("10个任务全部完成!");
// threadPool.shutdown();
// threadPool.shutdownNow(); // 不管是否执行完直接结束
// 4. 定时线程池:用于定时启动
Executors.newScheduledThreadPool(3).schedule(new Runnable() {
@Override
public void run() {
System.out.println("定时时间到!");
}
}, 10, TimeUnit.SECONDS);
}
}
=====console=====
.......
pool-1-thread-2 循环次数: 8 任务数: 2
pool-1-thread-1 循环次数: 8 任务数: 1
pool-1-thread-3 循环次数: 8 任务数: 3
pool-1-thread-2 循环次数: 9 任务数: 2
pool-1-thread-1 循环次数: 9 任务数: 1
pool-1-thread-3 循环次数: 9 任务数: 3
pool-1-thread-2 循环次数: 10 任务数: 2
pool-1-thread-1 循环次数: 10 任务数: 1
pool-1-thread-3 循环次数: 10 任务数: 3
pool-1-thread-2 循环次数: 1 任务数: 4
pool-1-thread-1 循环次数: 1 任务数: 5
pool-1-thread-3 循环次数: 1 任务数: 6
.......
可以看到在任务到10完成前只有3个任务数,当完成后才开放线程让第5个6个进来。。
同时可以看到程序一直处于运行状态中:
image.png
因为线程池中总是有3个线程没有消亡,线程不消亡程序就一直会运行。可以调用shutdown()方法结束。
几种不同的线程池比较:
1.newFixedThreadPool(n): 表示固定数量n的线程池
2.newCachedThreadPool(): 表示动态变化的线程池,与固定的不同,会随线程数增加而增加,若减少则一段时间后会自动清理掉。
3.newSingleThreadExecutor(): 单个线程 若线程消亡,会再开启一个,总是保证有一个线程。可以利用此来实现 线程死掉后重新启动这一功能。(阻塞队列)
4.newScheduledThreadPool(time): 表示启用一个定时任务多久之后启动。
网友评论