该多线程网络访问框架主要实现多线程并发以及线程的优先级控制。
首先给出该模块接口的调用示例:
//实例化访问模块
ThreadPage threadPage = new ThreadPage(Priority.PRIORITY_IDLE);
threadPage.setAutoDestory(true);
//注入一个实现runable接口的类,以及线程优先级
threadPage.execute(new userThread(), Priority.PRIORITY_NORM);
//ThreadPage中维护一个线程请求队列
private PriorityBlockingQueue<AsyncTask> priorityQueue;
priorityQueue = new PriorityBlockingQueue<AsyncTask>(200,new PriorityComparator());
将runnable接口实现注入队列时,实例化一个AsyncTask,AsycTask实现runnable接口,作为每一个运行线程的实例类。
threadpage主要用于维护一个线程队列,提供add,remove等方法。
在threadpage中继续实例化threadPool这个类,用于具体线程操作,并将theadpage注册。threadPool为这个带有优先级控制的多线程模块的核心类。threadPool类主要是基于ThreadPoolExecutor,此为java提供的一个线程池。thread pool一般被用来解决两个问题:当处理大量的同步task的时候,它能够避免thread不断创建销毁的开销;而另外一个也许更重要的含义是,它其实表示了一个boundary,通过使用thread pool可以限制这些任务所消耗的资源,比如最大线程数,比如最大的消息缓冲池。
theadpool做成一个单例模式,创建两个线程池,(ThreadPoolExecutor,其父类是ThreadPoolExecutor)并维护两个stack,分别为高优先级堆和低优先级堆。将创建的threadoage压入对应的stack当中。theadpool将实例化一个调度线程,其重现的run方法为整个线程池的调度控制的部分。
在具体的调度中,调度线程将不断的轮询。如有任务则执行任务,并短时间挂起轮询线程。否则挂起轮询线程,直至下次有任务唤醒。轮询线程总是要给一个短暂的挂起,防止出现抢占时间片的情形。