Java 小例子:创建和使用固定大小的线程池

Java 1.5 开始,提供了线程池供大家使用,功能还挺全的。下面是一个简单的例子。复杂的例子将放在后面几篇博客中。

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
 
/**
 * 固定大小线程池
 *
 * @author yiding.he
 */
public class FixedThreadPoolDemo {
 
    public static void main(String[] args) {
         
        // 创建一个最多同时运行 3 个任务的线程池
        ExecutorService service = Executors.newFixedThreadPool(3);
        System.out.println("线程池已创建");
        
        // 安排若干个任务运行
        for (int i = 0; i < 15; i++) {
            service.execute(new RunnableImpl(i + 1));
        }
        System.out.println("任务已提交到线程池");
        
        // 结束线程池。shutdown() 不会马上结束,而是等所有安排的任务执行完才结束。
        service.shutdown();
        
        // 如果不想马上结束,又不愿意等太长时间,那么可以调用 awaitTermination() 方法等待一段时间
        try {
            System.err.println("线程池已关闭,开始等待...");
            service.awaitTermination(5, TimeUnit.SECONDS);
            System.err.println("等待时间已过");
            
            // shutdownNow() 将放弃所有正在等待的任务,等当前执行的任务全部完成之后,结束线程池。
            List<Runnable> abandoned = service.shutdownNow();
            System.err.println("被遗弃的任务:" + abandoned);
            
        } catch (InterruptedException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }

    /**
     * 要执行的任务封装
     */
    private static class RunnableImpl implements Runnable {
 
        private int id;
 
        private RunnableImpl(int id) {
            this.id = id;
        }
 
        public void run() {
            System.out.println("开始执行任务" + id);
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // nothing to do
            }
            System.out.println("任务" + id + "执行完毕。");
        }
 
        @Override
        public String toString() {
            return "任务" + id;
        }
    }
}

下面是执行输出的例子:

线程池已创建
任务已提交到线程池
开始执行任务1
开始执行任务3
开始执行任务2
线程池已关闭,开始等待...
任务1执行完毕。
任务3执行完毕。
任务2执行完毕。
开始执行任务5
开始执行任务4
开始执行任务6
任务4执行完毕。
任务6执行完毕。
开始执行任务7
任务5执行完毕。
开始执行任务8
开始执行任务9
等待时间已过
被遗弃的任务:[任务10, 任务11, 任务12, 任务13, 任务14, 任务15]
任务9执行完毕。
任务8执行完毕。
任务7执行完毕。

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页