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
原创粉丝点击