基于java的web服务器毕业论文 - 图文

其优点是:任务到达时,由于不需要新建线程,而是直接使用已有线程,提高了应用程序的响应速度。而且,通过适当地调整线程池中的最大线程数目和最小线程数目,可以防止系统资源不足问题。

3.1.2.1实现

在DM WAS中我们使用了多线程机制,对于单个的请求都交给线程池模块进行处理。我们使用事件驱动处理的方法实现线程之间的调度。在事件驱动处理的情况下,需要一种发信机制来控制某一特定线程何时应该运行。在Java中,可以使用wait()、notify()和notifyAll()方法向线程发送信号。这些方法允许线程在一个对象上阻塞,直到所需的条件得到满足为止,然后再次开始运行。这种设计减少了CPU占用,因为线程在阻塞时不消耗执行时间,并且可在notify()方法被调用时立即唤醒。与其它方法相比,事件驱动方法可以提供更短的响应时间。

线程池模块包括线程池、工作线程、任务队列、任务接口等几个部分。 class ThreadPool implements LifeCycle{ void initPool();//初始化线程池 void createWorker();//创建工作线程

void execute(Task task);//执行指定任务/*将工作线程返回到池中*/

void returnWorker(WorkerThread worker);/*通知线程池该任务发生异常,从而线程池可以结束该任务并回收该任务所占用的工作线程*/

void errorOccur(Task task); }

ThreadPool代表线程池,其作用是创建、销毁并管理线程,将工作线程放入线程池中,调用工作线程执行任务,销毁异常任务。

class WorkerThread implements Runnable{ void run();//运行工作线程 boolean overtime();//线程是否超时 }

WorkerThread代表一个工作线程,它是一个独立的可以循环执行任务的线程对象,在没有任务时进行等待(wait),在任务到达时被唤醒(notify)执行。

class TaskQueue{

void pushTask(Task task);//将任务放入任务队列的队尾

Task popTask();//从任务队列的队头取出任务执//行并从队列中删除该任务 void RemoveTask(Task task);//从任务队列中移走任务 }

TaskQueue代表一个任务队列,其作用是提供一种缓冲机制,将没有处理的任务放在任务队列中,等到有工作线程可用时依次执行队列中的任务。

interface Task{

void start();//任务开始执行 void reject();//丢弃该任务 }

Task是一个接口,它是每个任务必须实现的接口,线程池只执行实现了该接口的类,它提供一组方法用来规定执行任务的入口、任务的执行状态、任务执行完后的收尾工作等,从而保证线程逻辑和应用逻辑的分离,工作线程通过该接口调度任务的执行。

3.1.2.2流程图

线程池处理任务的过程如图3.2所示。 3.2.2.3存在的问题

线程池为我们构建多线程的服务器应用程序提供了强大的机制,但使用它可能会出现一些问题。

1.资源不足问题

这里的资源包括线程自身所使用的资源、线程处理任务时可能需要的其它资源,例如数据库连接、Socket套接字或文件输入输出流等。资源不足问题的本质原因就是过多创建线程从而消耗包括内存和其它系统资源在内的大量资源。

为解决资源不足问题,我们在线程池中提供了几个参数供用户根据实际情况优化线程池。

(1)maxThreads:线程池中最大线程数,默认为无限大。通常我们期望 maxThreads应该是服务器能够接受的最大并发访问数。如果有多于maxThreads的并发请求,多余的请求将被任务队列进行缓存。

图3.2线程池处

>>展开全文<<
12@gma联系客服:779662525#qq.com(#替换为@)