美文网首页多线程并发
动手实现一个简单的线程池来理解其原理

动手实现一个简单的线程池来理解其原理

作者: 肥兔子爱豆畜子 | 来源:发表于2021-05-15 14:55 被阅读0次

    线程池的原理

    简单来说,就是对外提供一个方法用来提交task,然后内部有一个task队列存放提交上来的任务,内部启动了若干个worker线程,这些worker线程不断地从task队列里拿任务执行。这就是线程池的简单原理。

    线程池的作用

    • 线程复用,减少不必要的“创建线程,销毁,再创建...”这样一个开销
    • 控制最大并发数,能同时执行的任务数就是线程池里最多有多少个线程数。当然这里说的是应用层面,硬件层面则是cpu的核心数

    实现代码

    练习实现一个简单线程池。这个简单线程池里边有1个阻塞队列和两个固定的core worker线程组成。

    public class MyThreadPool {
        private static Logger logger = LoggerFactory.getLogger(MyThreadPool.class);
        private ArrayBlockingQueue<Runnable> taskQueue = new ArrayBlockingQueue<Runnable>(150); //任务队列
        
        public MyThreadPool() {
            super();
            for(int i=0; i<2; i++) {    //启动两个core worker线程
                Thread worker = new Thread(new Runnable() {
    
                    @Override
                    public void run() {
                        while(true) { //worker线程负责不断的从任务队列里阻塞的拿任务执行
                            try {
                                Runnable r = taskQueue.take(); //阻塞的从任务队列获取一个任务
                                r.run();  //执行具体的任务内容
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    
                });
                worker.setName("MyThreadPool-" + i);
                worker.start();
            }
        }
        public void execute(Runnable task) {
            taskQueue.add(task);
        }
    }
    

    测试一下这个简单线程池:

    MyThreadPool threadPool = new MyThreadPool();
            Runnable task1 = new Runnable() {
                @Override
                public void run() {
                    int i = 0;
                    while(i<10) {
                        i++;
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        logger.info("Hello world A.");
                    }
                }};
                Runnable task2 = new Runnable() {
                    @Override
                    public void run() {
                        int i = 0;
                        while(i<10) {
                            i++;
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            logger.info("Hello world B.");
                        }
                    }};
                    Runnable task3 = new Runnable() {
                        @Override
                        public void run() {
                            int i = 0;
                            while(i<10) {
                                i++;
                                try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                logger.info("Hello world C.");
                            }
                        }};
            threadPool.execute(task1);
            logger.info("已向MyThreadPool提交task1");
            threadPool.execute(task2);
            logger.info("已向MyThreadPool提交task2");
            threadPool.execute(task3);
            logger.info("已向MyThreadPool提交task3");
    

    运行效果:

    [main] com.wangan.tp.MyThreadPool [codeline:88] - 已向MyThreadPool提交task1
    [main] com.wangan.tp.MyThreadPool [codeline:90] - 已向MyThreadPool提交task2
    [main] com.wangan.tp.MyThreadPool [codeline:92] - 已向MyThreadPool提交task3
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:70] - Hello world B.
    [MyThreadPool-0] com.wangan.tp.MyThreadPool [codeline:56] - Hello world A.
    [MyThreadPool-0] com.wangan.tp.MyThreadPool [codeline:56] - Hello world A.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:70] - Hello world B.
    [MyThreadPool-0] com.wangan.tp.MyThreadPool [codeline:56] - Hello world A.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:70] - Hello world B.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:70] - Hello world B.
    [MyThreadPool-0] com.wangan.tp.MyThreadPool [codeline:56] - Hello world A.
    [MyThreadPool-0] com.wangan.tp.MyThreadPool [codeline:56] - Hello world A.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:70] - Hello world B.
    [MyThreadPool-0] com.wangan.tp.MyThreadPool [codeline:56] - Hello world A.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:70] - Hello world B.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:70] - Hello world B.
    [MyThreadPool-0] com.wangan.tp.MyThreadPool [codeline:56] - Hello world A.
    [MyThreadPool-0] com.wangan.tp.MyThreadPool [codeline:56] - Hello world A.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:70] - Hello world B.
    [MyThreadPool-0] com.wangan.tp.MyThreadPool [codeline:56] - Hello world A.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:70] - Hello world B.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:70] - Hello world B.
    [MyThreadPool-0] com.wangan.tp.MyThreadPool [codeline:56] - Hello world A.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:84] - Hello world C.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:84] - Hello world C.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:84] - Hello world C.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:84] - Hello world C.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:84] - Hello world C.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:84] - Hello world C.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:84] - Hello world C.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:84] - Hello world C.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:84] - Hello world C.
    [MyThreadPool-1] com.wangan.tp.MyThreadPool [codeline:84] - Hello world C.
    

    相关文章

      网友评论

        本文标题:动手实现一个简单的线程池来理解其原理

        本文链接:https://www.haomeiwen.com/subject/djohjltx.html