JAVA线程缓存池
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建⼀个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若⽆可回收,则新建线程。newFixedThreadPool 创建⼀个定长线程池,可控制线程最⼤并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建⼀个定长线程池,⽀持定时及周期性任务执⾏。
newSingleThreadExecutor 创建⼀个单线程化的线程池,它只会⽤唯⼀的⼯作线程来执⾏任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执⾏。
(1) newCachedThreadPool
创建⼀个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若⽆可回收,则新建线程。⽰例代码如下:
Java代码
1. package test;
2. import urrent.ExecutorService;
3. import urrent.Executors;
4. public class ThreadPoolExecutorTest {
5. public static void main(String[] args) {
6. ExecutorService cachedThreadPool = wCachedThreadPool();
7. for (int i = 0; i < 10; i++) {
8. final int index = i;
9. try {
10. Thread.sleep(index * 1000);
11. } catch (InterruptedException e) {
12. e.printStackTrace();
13. }
14. ute(new Runnable() {
15. public void run() {
16. System.out.println(index);
17. }
18. });
19. }
20. }
21. }
线程池为⽆限⼤,当执⾏第⼆个任务时第⼀个任务已经完成,会复⽤执⾏第⼀个任务的线程,⽽不⽤每次新建线程。
(2) newFixedThreadPool
创建⼀个定长线程池,可控制线程最⼤并发数,超出的线程会在队列中等待。⽰例代码如下:
Java代码
1. package test;
2. import urrent.ExecutorService;
3. import urrent.Executors;
java线程池创建的四种4. public class ThreadPoolExecutorTest {
5. public static void main(String[] args) {
6. ExecutorService fixedThreadPool = wFixedThreadPool(3);
7. for (int i = 0; i < 10; i++) {
8. final int index = i;
9. ute(new Runnable() {
10. public void run() {
11. try {
12. System.out.println(index);
13. Thread.sleep(2000);
14. } catch (InterruptedException e) {
15. e.printStackTrace();
16. }
17. }
18. });
19. }
20. }
21. }
因为线程池⼤⼩为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的⼤⼩最好根据系统资源进⾏设置。如Runtime().availableProcessors()
(3) newScheduledThreadPool
创建⼀个定长线程池,⽀持定时及周期性任务执⾏。延迟执⾏⽰例代码如下:
Java代码
1. package test;
2. import urrent.Executors;
3. import urrent.ScheduledExecutorService;
4. import urrent.TimeUnit;
5. public class ThreadPoolExecutorTest {
6. public static void main(String[] args) {
7. ScheduledExecutorService scheduledThreadPool = wScheduledThreadPool(5);
8. scheduledThreadPool.schedule(new Runnable() {
9. public void run() {
10. System.out.println("delay 3 seconds");
11. }
12. }, 3, TimeUnit.SECONDS);
13. }
14. }
表⽰延迟3秒执⾏。
定期执⾏⽰例代码如下:
Java代码
1. package test;
2. import urrent.Executors;
3. import urrent.ScheduledExecutorService;
4. import urrent.TimeUnit;
5. public class ThreadPoolExecutorTest {
6. public static void main(String[] args) {
7. ScheduledExecutorService scheduledThreadPool = wScheduledThreadPool(5);
8. scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
9. public void run() {
10. System.out.println("delay 1 seconds, and excute every 3 seconds");
11. }
12. }, 1, 3, TimeUnit.SECONDS);
13. }
14. }
表⽰延迟1秒后每3秒执⾏⼀次。
(4) newSingleThreadExecutor
创建⼀个单线程化的线程池,它只会⽤唯⼀的⼯作线程来执⾏任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执⾏。⽰例代码如下:Java代码
1. package test;
2. import urrent.ExecutorService;
3. import urrent.Executors;
4. public class ThreadPoolExecutorTest {
5. public static void main(String[] args) {
6. ExecutorService singleThreadExecutor = wSingleThreadExecutor();
7. for (int i = 0; i < 10; i++) {
8. final int index = i;
9. ute(new Runnable() {
10. public void run() {
11. try {
12. System.out.println(index);
13. Thread.sleep(2000);
14. } catch (InterruptedException e) {
15. e.printStackTrace();
16. }
17. }
18. });
19. }
20. }
21. }
结果依次输出,相当于顺序执⾏各个任务。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论