使用实时Java进行开发,第2部分 改善服务质量 - 编程入门网
{
ThreadFactory theFactory = new ThreadFactory();
this.threadPool = Executors.newFixedThreadPool(numThreads, theFactory);
}
public void start() {
while (true) {
// main server handling loop, find a task to do
// create a "TaskHandler" object to complete this operation
TaskHandler task = new TaskHandler();
this.threadPool.execute(task);
}
this.threadPool.shutdown();
}
public static void main(String[] args) {
int serverThreads = Integer.parseInt(args[0]);
Server theServer = new Server(serverThreads);
theServer.start();
}
}
class TaskHandler extends Runnable {
public void run() {
// code to handle a "task"
}
}
此服务器可以创建所有需要的线程,直到达到创建服务器(从此示例中的命令行解码)时指定的最大数量。每个工作者线程使用 TaskHandler 类执行一部分工作。出于我们的目的,我们将创建一个 TaskHandler.run() 方法,它每次运行都应该花相同的时间。因此,执行 TaskHandler.run() 的时间上的任何易变性都源自于底层 JVM 中的暂停或易变性、某个线程问题或在堆栈的较低级别上引入的暂停。清单 6 给出了 TaskHandler 类: 清单 6. 具有可预测性能的 TaskHandler 类
使用实时Java进行开发,第2部分 改善服务质量(6)时间:2011-01-27 IBM Mark Stoodley此 run() 方法中的循环计算 N (50,000) 个整数中前 M (100) 个整数的和。M 和 N 的值已经选定,以便运行循环的事务时间为 10 毫秒左右,使一项操作可以被一个 OS 调度限额(通常持续约 10 毫秒)中断。我们在此计算构造此循环的目的在于,使 JIT 编译器能够生成将执行高度可预测的时间量的出色代码:run() 方法不会显式在对 System.nanoTime() 的两次调用中显式阻塞,这两次调用用于计算循环运行的时间。由于上述代码高度可预测,所以我们可以使用它来展示延迟和易变性的不一定来源于您测试的代码。 我们使此应用程序稍微真实一些,在运行 TaskHandler 代码时激活垃圾收集器子系统。清单 7 给出了这个 GCStressThread 类: 清单 7. 用于不断生成垃圾的 GCStressThread 类
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |