美文网首页
简易线程池的实现

简易线程池的实现

作者: wengle | 来源:发表于2017-12-03 17:37 被阅读0次

构成线程池的基本元素

  • 线程池中的线程
  • 任务队列
  • 生产者
  • 消费者
  1. 线程池
public class ThreadPool {  
    //用blockingQueue创建一个任务队列,初始化长度为5  
    private BlockingQueue<Runnable> tasksQueue = new ArrayBlockingQueue<Runnable>(5);  
    //定义线程池中消费者最大数量 
    private int consumers = 3;  
      
    //这个方法提供给所有的任务生产者,产生新的任务插入  
    public void insertTask(Runnable task) throws InterruptedException{  
        tasksQueue.put(task);  
    }  
      
    //线程池的初始化  
    public ThreadPool(){  
        //激活消费者,等待问题到来  
        for(int i=1;i<=consumers;i++){  
            Solver consumer = new Solver(tasksQueue,i);  
            consumer.start();  
        }  
    }  
}  
  1. 消费者
public class Solver extends Thread{  
      
    //引用线程池的任务队列,消费者不断的从里面取得任务去解决  
    private BlockingQueue<Runnable> taskQueue = null;  
      
    private String name;  
      
    Solver(BlockingQueue<Runnable> tasks,int name){  
        this.taskQueue = tasks;  
        this.name = String.valueOf(name);  
    }  
      
    public void run(){  
        try {  
            while(true){  
                //从队列中取出任务执行,注意这里用了take方法,所以如果队列空了,那么线程会等待,直到有任务来了,继续执行  
                Runnable task = taskQueue.take();  
                System.out.println("消费者"+name+"接收了一个任务");  
                task.run();  
                System.out.println("消费者"+name+"解决了一个任务");  
            }  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
    }  
}  
  1. 生产者
public class ProblemCreater {  
  
    public static void main(String[] args) throws Exception {  
        //初始化线程池  
        ThreadPool threadPool = new ThreadPool();  
          
        //生成者不断产生任务  
        for(int i=1;i<10;i++){  
              
            //定义一个新的任务  
            Runnable task = new Runnable(){  
                public void run(){  
                    Random random = new Random();  
                    //随机一个数字模拟需要解决的时间  
                    int randomTime = Math.abs(random.nextInt())%20;  
                    //System.out.println("这个任务需要解决时间为:"+randomTime);  
                    try {  
                        Thread.sleep(randomTime*1000);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                }  
            };  
            //将问题插入到线程池任务队列中  
            threadPool.insertTask(task);  
            System.out.println("插入新的任务"+i);  
        }  
    }  
}  

问题

  • 任务队列的大小:如果消费者的消费能力跟不上生产者的,这个任务队列的长度就会越来越长。
  • 线程池中线程的个数:线程池中能同时运行的最多的线程数,如果线程数太多的话会严重影响系统的稳定性。

相关文章

  • 线程池-1

    要点: 1.线程池原理,wait/notify ? 实现一个简易的线程池,http://ifeve.com/thr...

  • 简易线程池实现

    ThreadPool.java PThread.java--永不停止的线程,用于配合线程池 Mythread.ja...

  • 简易线程池

    来自《Java并发编程的艺术》 一个简易的线程池的实现。三个类:ThreadPool线程池接口DefaultThr...

  • 简易线程池的实现

    构成线程池的基本元素 线程池中的线程 任务队列 生产者 消费者 线程池 消费者 生产者 问题 任务队列的大小:如果...

  • Android HttpURLConnection简易框架

    1、概述 封装一个简易的HttpURLConnection简易框架,内部通过线程池来进行网络请求。同时实现了请求返...

  • 线程池简易实现和线程池源码

    线程池简单实现 源码 ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 ...

  • 线程以及java线程池实现分享

    线程以及java线程池实现分享 线程简介 JDK线程池的工作原理 JDK线程池的实现细节 1.线程简介-由来 1....

  • java多线程面试题

    实现多线程的方法 1.实现Thread接口 2.实现Runnable接口创建线程 3.实现 线程池 创建线程池的代...

  • 不怕难之线程池原理

    一、线程池状态 ThreadPoolExecutor 是 JDK 中的线程池实现,这个类实现了一个线程池需要的各个...

  • 线程池的原理

    参考 深入Java源码理解线程池原理 线程池是对CPU利用的优化手段 线程池使用池化技术实现,替他的实现还有连接池...

网友评论

      本文标题:简易线程池的实现

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