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

Posted

篇首语:金鞍玉勒寻芳客,未信我庐别有春。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用实时Java降低Java应用程序的易变性(2)相关的知识,希望对你有一定的参考价值。

使用实时Java降低Java应用程序的易变性(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Java 服务器示例

  在本文剩余部分 我们将应用在前面章节中介绍的一些想法 使用 Java 类库中的 Executors 服务构建一个相对简单的 Java 服务器应用程序 只需少量应用程序代码 Executors 服务就可以用于创建一个服务器来管理工作者线程池 如清单 所示

  清单 使用 Executors 服务的 Server 和 TaskHandler 类

  import ncurrent Executors;

  import ncurrent ExecutorService;

  import ncurrent ThreadFactory;

  class Server

  private ExecutorService threadPool;

  Server(int numThreads)

  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 plete this operation

  TaskHandler task = new TaskHandler();

  this threadPool execute(task);

  

  this threadPool shutdown();

  

  public static void main(String[] args)

  int serverThreads = Integer parseInt(args[ ]);

  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 中的暂停或易变性 某个线程问题或在堆栈的较低级别上引入的暂停 清单 给出了 TaskHandler 类

  清单 具有可预测性能的 TaskHandler 类

  import java lang Runnable;

  class TaskHandler implements Runnable

  static public int N= ;

  static public int M= ;

  static long result= L;

  // constant work per transaction

  public void run()

  long dispatchTime = System nanoTime();

  long x= L;

  for (int j= ;j < M;j++)

  for (int i= ;i < N;i++)

  x = x + i;

  

  

  result = x;

  long endTime = System nanoTime();

  Server reportTiming(dispatchTime endTime);

  

  

  此 run() 方法中的循环计算 N ( ) 个整数中前 M ( ) 个整数的和 M 和 N 的值已经选定 以便运行循环的事务时间为 毫秒左右 使一项操作可以被一个 OS 调度限额(通常持续约 毫秒)中断 我们在此计算构造此循环的目的在于 使 JIT 编译器能够生成将执行高度可预测的时间量的出色代码 run() 方法不会显式在对 System nanoTime() 的两次调用中显式阻塞 这两次调用用于计算循环运行的时间 由于上述代码高度可预测 所以我们可以使用它来展示延迟和易变性的不一定来源于您测试的代码

  我们使此应用程序稍微真实一些 在运行 TaskHandler 代码时激活垃圾收集器子系统 清单 给出了这个 GCStressThread 类

  清单 用于不断生成垃圾的 GCStressThread 类

  class GCStressThread extends Thread

  HashMap<Integer BinaryTree> map;

  volatile boolean stop = false;

  class BinaryTree

  public BinaryTree left;

  public BinaryTree right;

  public Long value;

  

  private void allocateSomeData(boolean useSleep)

  try

  for (int i= ;i < ;i++)

  if (useSleep)

  Thread sleep( );

  BinaryTree newTree = createNewTree( ); // create full level BinaryTree

  this map put(new Integer(i) newTree);

  

   catch (InterruptedException e)

  stop = true;

  

  

  public void initialize()

  this map = new HashMap<Integer BinaryTree>();

  allocateSomeData(false);

  System out println( \\nFinished initializing\\n );

  

  public void run()

  while (!stop)

  allocateSomeData(true);

  

  

  

  GCStressThread 通过 HashMap 维护一组 BinaryTree 它为存储新 BinaryTree 结构的 HashMap 迭代一组相同的 Integer 键 这些结构是完全填充的 级 BinaryTrees (所以每个 BinaryTree 有 = 个节点被存储在 HashMap 中) HashMap 在每次迭代时都持有 个 BinaryTree(活动数据) 它每隔 毫秒就会将其中一个节点替换为新的 BinaryTree 通过这种方式 此数据结构维持着一个相当复杂的活动对象集 并且以特定速率生成垃圾 首先使用 initialize() 例程 借助 个 BinaryTree 来初始化HashMap initialize() 例程不会在对每棵树的收集之间暂停 一旦启动了 GCStressThread(在启动服务器之前) 它将通过服务器的工作者线程全权处理 TaskHandler 操作

  我们不打算使用客户端来驱动此服务器 我们将直接在服务器的主循环(在 Server start() 方法中)中创建 NUM_OPERATIONS == 操作 清单 给出了 Server start() 方法

  清单 在服务器内部分派操作

  public void start()

  for (int m= ; m < NUM_OPERATIONS;m++)

  TaskHandler task = new TaskHandler();

  threadPool execute(task);

  

  try

  while (!serverShutdown) // boolean set to true when done

  Thread sleep( );

  

  

  catch (InterruptedException e)

  

cha138/Article/program/Java/hx/201311/25863

相关参考

知识大全 Java实时多任务调度过程中的安全监控设计

Java实时多任务调度过程中的安全监控设计  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Java进阶 Java应用程序中动态分配CPU资源[2]

Java进阶Java应用程序中动态分配CPU资源[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 使用UML编写Java应用程序 (2)实现

使用UML编写Java应用程序(2)实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  程序设计

知识大全 将 Java 应用程序迁移到 .NET(2)

将Java应用程序迁移到.NET(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  不使用自动

知识大全 两种方法定位Java应用程序瓶颈(2)

两种方法定位Java应用程序瓶颈(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  继续最优化

知识大全 Java程序性能优化(2)

Java程序性能优化(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  八如果只是查找单个字符

知识大全 Java程序开发中如何应用线程[2]

Java程序开发中如何应用线程[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 Java程序性能优化-缓冲(Buffer)(2)[2]

Java程序性能优化-缓冲(Buffer)(2)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 Java程序性能优化-对象复用“池”(2)[2]

Java程序性能优化-对象复用“池”(2)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java程序性能优化-负载均衡(2)

Java程序性能优化-负载均衡(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!