首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>java教程>资讯:使用实时Java降低Java应用程序的易变性(2)

使用实时Java降低Java应用程序的易变性(2)

www.jz123.cn  2010-10-22   来源:   中国建站    责任编辑(袁袁)    我要投递新闻

  Java 服务器示例

  在本文剩余部分,我们将应用在前面章节中介绍的一些想法,使用 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)

评论总数:0 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图