栏目导航
热点推荐
- 三十条有用的 Java 编程规则
- Java制作水印图片源码
- Java常见异常及可能的导致原因
- Java中的修饰词使用方法总结
- J2EE系统异常的处理准则
- Java中的异常、断言、日志解析(
- Java面试技巧:Java面试题集锦(
- 面向Java开发人员的Scala指南:
- Java程序员:一刻钟精通正则表达
- 网友经验分享:学好java开发的关
- 专家解答:创建表格与数据库进行
- Java远程访问Domino数据库
阅览排行
使用实时Java降低Java应用程序的易变性(2)
www.jz123.cn 2010-10-22 来源: 中国建站 责任编辑(袁袁) 我要投递新闻
在本文剩余部分,我们将应用在前面章节中介绍的一些想法,使用 Java 类库中的 Executors 服务构建一个相对简单的 Java 服务器应用程序。只需少量应用程序代码,Executors 服务就可以用于创建一个服务器来管理工作者线程池,如清单 5 所示:
清单 5. 使用 Executors 服务的 Server 和 TaskHandler 类
import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadFactory; class Server { private ExecutorService threadPool; Server(int numThreads) { ThreadFactory theFactory = new ThreadFactory(); this.threadPool = Executors.newFixedThreadPool(numThreads, theFactory); |
此服务器可以创建所有需要的线程,直到达到创建服务器(从此示例中的命令行解码)时指定的最大数量。每个工作者线程使用 TaskHandler 类执行一部分工作。出于我们的目的,我们将创建一个 TaskHandler.run() 方法,它每次运行都应该花相同的时间。因此,执行 TaskHandler.run() 的时间上的任何易变性都源自于底层 JVM 中的暂停或易变性、某个线程问题或在堆栈的较低级别上引入的暂停。清单 6 给出了 TaskHandler 类:
清单 6. 具有可预测性能的 TaskHandler 类
import java.lang.Runnable; class TaskHandler implements Runnable { static public int N=50000; static public int M=100; static long result=0L; // constant work per transaction public void run() { long dispatchTime = System.nanoTime(); long x=0L; for (int j=0;j < M;j++) { for (int i=0;i < N;i++) { x = x + i; } } result = x; long endTime = System.nanoTime(); Server.reportTiming(dispatchTime, endTime); } } |
此 run() 方法中的循环计算 N (50,000) 个整数中前 M (100) 个整数的和。M 和 N 的值已经选定,以便运行循环的事务时间为 10 毫秒左右,使一项操作可以被一个 OS 调度限额(通常持续约 10 毫秒)中断。我们在此计算构造此循环的目的在于,使 JIT 编译器能够生成将执行高度可预测的时间量的出色代码:run() 方法不会显式在对 System.nanoTime() 的两次调用中显式阻塞,这两次调用用于计算循环运行的时间。由于上述代码高度可预测,所以我们可以使用它来展示延迟和易变性的不一定来源于您测试的代码。
上一篇:使用实时Java降低Java应用程序的易变性(1) 下一篇:使用实时Java降低Java应用程序的易变性(3)