线程池原理及其实现

简介: 我在学习谷歌电子市场的制作的时候,遇到这个线程池问题的时候不太理解,所以去网上查了一下资料,转载过来了,代码是谷歌市场应用的线程池的代码#。 1、线程池:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。          假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时

我在学习谷歌电子市场的制作的时候,遇到这个线程池问题的时候不太理解,所以去网上查了一下资料,转载过来了,代码是谷歌市场应用的线程池的代码#。


1、线程池:

    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。
    
    假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。
    
    如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。
                一个线程池包括以下四个基本组成部分:
                1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
                2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
                3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
                4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。
                
    线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。


    线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目,看一个例子:


    假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。

  public class ThreadPool {
        int maxCount = 3;
        AtomicInteger count =new AtomicInteger(0);// 当前开的线程数  count=0
        LinkedList<Runnable> runnables = new LinkedList<Runnable>();

        public void execute(Runnable runnable) {
            runnables.add(runnable);
            if(count.incrementAndGet()<=3){
                createThread();
            }
        }
        private void createThread() {
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    while (true) {
                        // 取出来一个异步任务
                        if (runnables.size() > 0) {
                            Runnable remove = runnables.remove(0);
                            if (remove != null) {
                                remove.run();
                            }
                        }else{
                            //  等待状态   wake();
                        }
                    }
                }
            }.start();
        }
    }

  public class ThreadPool {
        int maxCount = 3;
        AtomicInteger count =new AtomicInteger(0);// 当前开的线程数  count=0
        LinkedList<Runnable> runnables = new LinkedList<Runnable>();

        public void execute(Runnable runnable) {
            runnables.add(runnable);
            if(count.incrementAndGet()<=3){
                createThread();
            }
        }
        private void createThread() {
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    while (true) {
                        // 取出来一个异步任务
                        if (runnables.size() > 0) {
                            Runnable remove = runnables.remove(0);
                            if (remove != null) {
                                remove.run();
                            }
                        }else{
                            //  等待状态   wake();
                        }
                    }
                }
            }.start();
        }
    }
分析:由于并没有任务接口,传入的可以是自定义的任何任务,所以线程池并不能准确的判断该任务是否真正的已经完成(真正完成该任务是这个任务的run方法执行完毕),只能知道该任务已经出了任务队列,正在执行或者已经完成。

2、java类库中提供的线程池简介:


     java提供的线程池更加强大,相信理解线程池的工作原理,看类库中的线程池就不会感到陌生了。








目录
相关文章
|
18天前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
1月前
|
算法 安全 调度
多线程如何工作,工作原理是什么
多线程如何工作,工作原理是什么
|
3月前
|
存储 安全 调度
探索Python的多线程编程:原理与实践
探索Python的多线程编程:原理与实践
60 0
|
2天前
|
Java
并发编程之线程池的底层原理的详细解析
并发编程之线程池的底层原理的详细解析
11 0
|
24天前
|
存储 安全 Java
Java线程池ThreadPoolExcutor源码解读详解04-阻塞队列之PriorityBlockingQueue原理及扩容机制详解
1. **继承实现图关系**: - `PriorityBlockingQueue`实现了`BlockingQueue`接口,提供了线程安全的队列操作。 - 内部基于优先级堆(小顶堆或大顶堆)的数据结构实现,可以保证元素按照优先级顺序出队。 2. **底层数据存储结构**: - 默认容量是11,存储数据的数组会在需要时动态扩容。 - 数组长度总是2的幂,以满足堆的性质。 3. **构造器**: - 无参构造器创建一个默认容量的队列,元素需要实现`Comparable`接口。 - 指定容量构造器允许设置初始容量,但不指定排序规则。 - 可指定容量和比较
42 2
|
28天前
|
设计模式 安全 C++
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
71 2
|
30天前
|
Java 程序员 API
【深入探究 Qt 线程】一文详细解析Qt线程的内部原理与实现策略
【深入探究 Qt 线程】一文详细解析Qt线程的内部原理与实现策略
77 0
|
1月前
|
Java API 开发者
springboot 多线程的使用原理与实战
在Spring Boot中实现多线程,主要依赖于Spring框架的@Async注解以及底层Java的并发框架。这里将深入剖析Spring Boot多线程的原理,包括@Async注解的工作方式、任务执行器的角色以及如何通过配置来调整线程行为。
40 5
|
1月前
|
负载均衡 Java 数据处理
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用(三)
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用
52 2
|
1月前
|
存储 监控 Java
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用(二)
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用
42 1