调度流程中有三个主要的类
- Scheduler-调度器
- WorkThread-调度运行承载线程
- Task-类似于Thread,协程的体现者
主题流程如下:
Scheduler
关键属性有:
public static int defaultNumberThreads;
public LinkedList<WorkerThread> allThreads = new LinkedList();//所有线程
public RingQueue<WorkerThread> waitingThreads = new RingQueue(10);//
protected volatile boolean shutdown = false;
public RingQueue<Task> runnableTasks = new RingQueue(100);
其中RingQueue是实现的一个环形队列,runnableTasks用于存储需要调度的task,waitingThreads是在等待的线程。
初始化时会创建WorkerThread,创建的线程个数是CPU可用,并运行
public Scheduler(int numThreads) {
for(int i = 0; i < numThreads; ++i) {
WorkerThread wt = new WorkerThread(this);
this.allThreads.add(wt);
this.addWaitingThread(wt);
wt.start();
}
}
调度时,加入runnableTasks,同时从waitingThreads取出一个workThread,调用其notify,是因为workThread在没有Task时会调用wait()等待Task