java

位置:IT落伍者 >> java >> 浏览文章

Java进阶 Java应用程序中动态分配CPU资源[3]


发布日期:2019年02月10日
 
Java进阶 Java应用程序中动态分配CPU资源[3]

如果仅仅做到这一步完成一个像Windows 中的多任务系统实际只用了一个线程没有利用Java多线程的特点应该注意到虽然Java系统中线程调度与平台相关但是相同优先级的线程之间分时运行的特点基本上是不受特定平台影响的各个相同优先级的线程共享CPU资源而线程又被映射成了Java语言中的Thread对象这些对象就可以被认为是CPU资源的代表Thread与线程执行代码主体的接口—Runnable之间是多对一的关系一个Runnable可以被多个Thread 执行只要将Runnable的执行代码设置成上述的消息调度函数并和消息队列对应上那么就可以通过控制为它服务的Thread个数来决定消息队列执行的快慢并且在运行时可以动态地新增(new)和退出Thread对象这样就能任意调整不同消息队列在执行时所占用CPU资源的多少至此任何一个 Java调用都可以在Thread个数不同的消息队列中选择并可以调整这些消息队列服务的Thread个数从而实现在运行时调整任务所占用的CPU资源

纵观整个方案由于仅仅基于Java语言固有的Method对象不同任务间动态分配CPU资源并没有对任务的性质及其处理流程有任何限制那么在消息队列中没有高优先级消息时低优先级消息的处理函数自然会全部占用CPU资源在不同消息队列处理速度任意设置时并没有将特定的消息限制在快的或者慢的消息队列上如果系统的负荷超出(比如消息队列长度超过一定限制)只要将队列中低优先级消息换出或者拒绝不能处理的消息进入那么系统的运行就可以基本上不受负荷压力的影响从而最大保障用户的关键业务需求

当然协调式多任务的思想也有其局限性主要就是它的调度粒度比较大系统能够保证的粒度是一次消息处理过程如果消息处理逻辑非常费时那么编程人员就必须再处理函数内部让系统主动让出CPU资源这虽然需要在处理消息响应逻辑时增加一个考虑因素但是在Windows系统盛行的今天这是一个已经被普遍接受的思路由于方案中并没有局限为消息队列服务的线程数目所以一个长时间的消息响应只会影响一个线程而不会对整个系统产生致命的影响除了调度粒度的问题以外还有访问消息队列操作在各个线程间互斥的问题取出消息的过程是串行化的因此对于这一瓶颈的解决方案就是假设取出一条消息的操作相对于处理消息的消耗可以忽略不计那么对于多次调用且仅有两三行响应逻辑的消息编程人员通过函数调用就可以直接执行

前面比较详细地阐述了多任务系统中任务的划分以及执行等内容虽然这些是一个系统的核心但是在一个实用的系统中还需要任务间的同步互斥等机制在上述框架内互斥可以简单地用Java的Synchronized机制实现由于任务可以主动让出执行权限要实现等待(Wait任务中止)和通知(Notify任务继续)从而实现任务同步也就比较容易了

[] [] []

               

上一篇:Java进阶 Java应用程序中动态分配CPU资源[1]

下一篇:Java编程那些事儿9——网络编程基础[1]