Android java 实现自己线程池
来源:互联网 发布:性别歧视 知乎 编辑:程序博客网 时间:2024/06/08 00:39
/** * Created by johnny on 2017/2/24. */public class MyThreadPool implements Executor { private int mMinThreadNum = 0; private int mMaxThreadNum = 5; private int mThreadKeepTime = 15000;//毫秒 private LinkedList<Runnable> mTaskList = new LinkedList<>(); private List<Worker> mWorkList; public MyThreadPool() { mWorkList = new ArrayList<>(mMaxThreadNum); } public MyThreadPool(int minThreadNum, int maxThreadNum, int threadKeepTime) { mMaxThreadNum = maxThreadNum; mMinThreadNum = minThreadNum; mThreadKeepTime = threadKeepTime; if (minThreadNum < 0 || minThreadNum <= maxThreadNum) { throw new IllegalArgumentException("minThreadNum 要大于0 并且小于maxThreadNum"); } mWorkList = new ArrayList<>(mMaxThreadNum); } public synchronized void execute(Runnable command) { if (command == null) return; Worker worker; synchronized (mWorkList) { if (mWorkList.size() < mMinThreadNum) { createWorker(command); return; } worker = getIdleWorker(); if (worker != null) { synchronized (worker) { worker.mTask = command; worker.notify(); } return; } if (mWorkList.size() < mMaxThreadNum) { createWorker(command); return; } } synchronized (mTaskList) { mTaskList.add(command); } } public void shutdown() { synchronized (mWorkList) { while(mWorkList.size() > 0) { Worker worker = mWorkList.remove(0); if (worker != null) { worker.mIsRunning = false; worker.notify(); } } } } private void createWorker(Runnable runnable) { Worker worker = new Worker(runnable); Thread thread = new Thread(worker, "MyThreadPool"); mWorkList.add(worker); thread.start(); } private Worker getIdleWorker() { for (int i = 0; i < mWorkList.size(); i++) { Worker worker = mWorkList.get(i); if (worker.mIsRunning && worker.mTask == null) { return worker; } } return null; } class Worker implements Runnable { private volatile long mLastRunTime; private volatile boolean mIsRunning = true; private volatile Runnable mTask; Worker(Runnable task) { mTask = task; } public void run() { while (mIsRunning) { if (mTask == null) { synchronized (mTaskList) { if (!mTaskList.isEmpty()) { mTask = mTaskList.removeFirst(); } } } if (mTask != null) { mLastRunTime = System.currentTimeMillis(); mTask.run(); mTask = null; mLastRunTime = System.currentTimeMillis(); } else { if ((System.currentTimeMillis() - mLastRunTime) >= mThreadKeepTime) { synchronized (mWorkList) { if (mTask != null){ continue; } if (mWorkList.size() > mMinThreadNum) { mWorkList.remove(this); mIsRunning = false; return; } } } try { synchronized (this) { if (mTask == null) { this.wait(mThreadKeepTime); } } } catch (InterruptedException e) { mIsRunning = false; Thread.currentThread().interrupt(); synchronized (mWorkList) { mWorkList.remove(this); } } } } } }}
0 0
- Android java 实现自己线程池
- 自己实现JAVA线程池
- 自己实现一个“线程池”
- 自己实现一个“线程池”
- 自己实现的线程池
- java线程池自己理解
- 自己实现一个“线程池”zz
- 利用ACE 自己实现的线程池
- c#自己实现线程池功能(一)
- c#自己实现线程池功能(二)
- Java(线程)Android线程池
- Java实现线程池
- Java线程池实现
- java实现线程池
- java线程池实现
- java实现线程池
- 利用Java编写自己的线程池
- java线程池---编写自己的线程池
- c++primer plus 第七章 函数
- 数据库连接池的优点
- 使用html5获取当前手机的经纬度,并接入百度地图API,查询出当前位置
- vsflexgrid+打印整理后的方法
- 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫
- Android java 实现自己线程池
- 使用Subversion版本控制工具
- myeclipse闪退的问题
- sqli-labs学习教程(七)
- 手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取
- Codeforces 768A Oath of the Night's Watch
- 解决问题: Ubuntu装Caffe出现无法登陆图形界面或者循环登陆(Loop Login)
- pycharm 2017
- 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染