java实现实时通讯功能_利用实时Java的独特功能

实时Java是Java语言的一组增强功能,它们为应用程序提供的实时性能要超过标准Java技术。 实时性能与传统的吞吐量性能不同,传统的吞吐量性能通常是对可以在固定时间内完成的指令,任务或工作总数的度量。 实时性能侧重于应用程序需要在不超过给定时间限制的情况下响应外部刺激的时间。 在硬实时系统中,绝不能超过这种限制; 软实时系统对冲突的容忍度更高。 实时性能要求应用程序本身获得对处理器的控制,以便它可以对刺激做出响应,并且在响应刺激时,虚拟机内的竞争进程不会阻止应用程序的代码执行。 实时Java提供了Java应用程序以前无法满足的响应能力。

实时JVM可以利用实时操作系统(RTOS)服务来提供硬实时功能,或者可以在更常规的操作系统上运行,以用于具有较弱实时约束的应用程序。 当您切换为使用实时JVM时,实时Java中使用的某些技术是“免费”的。 但是要利用实时Java的某些功能,需要对应用程序进行一些更改。 这些功能是本文的重点。

JVM通过执行只能由应用程序严格控制的工作来为给定的应用程序提供服务。 JVM中有几个运行时子流程,包括:

  • 垃圾回收 :这是回收应用程序丢弃的运行时内存块的工作。 垃圾回收可能会使应用程序的执行延迟一段时间。
  • 类加载 :此过程之所以被称为是因为Java应用程序是按类的粒度加载的,因此涉及从文件系统或网络加载应用程序结构,指令和其他资源。 在标准Java中,应用程序在首次引用时会加载每个类( 延迟加载)。
  • 即时(JIT)动态编译 :在应用程序运行时,许多虚拟机都使用从解释后的Java字节码到本机指令的动态编译方法。 尽管这可以提高性能,但是编译活动本身可能导致暂时的延迟,从而阻止了应用程序代码的运行。
  • 调度 :在标准Java中,允许对应用程序进行最小程度的控制,以规定其自身正在运行的线程的调度以及与同一操作系统上运行的其他应用程序相关的应用程序的调度。

所有这些子流程都会阻碍应用程序对外部刺激的响应,因为它们会延迟应用程序代码的执行。 例如,可以调度指令序列以响应于来自网络,雷达系统,键盘或任何其他设备的信号而执行。 实时应用程序具有最小可接受的时间段,在该时间段内允许无关的进程(例如垃圾回收)延迟指令的响应序列的执行。

实时Java提供了各种技术,旨在最大程度地减少这些底层子进程对应用程序的干扰。 切换到实时JVM时出现的“免费”技术包括专门的垃圾收集,该垃圾收集限制了收集中断的时间和影响,专门的类加载允许在启动时优化性能,而不是延迟优化,专门的锁定和同步,以及专门的优先级线程调度(避免优先级反转)。 但是,需要对应用程序进行一些修改,尤其是要利用Java实时规范(RTSJ)引入的功能。

RTSJ提供了一个API,可在JVM中启用众多实时功能。 这些功能中的某些功能在规范的实现中是必需的,其他功能是可选的。 该规范涵盖以下方面的一般领域:

  • 实时调度
  • 高级内存管理
  • 高分辨率计时器
  • 异步事件处理
  • 线程异步中断

Realtime线程

RTSJ定义了javax.realtime.RealtimeThread —标准java.lang.Thread类的子类。 RealtimeThread本身可以启用该规范的某些高级功能。 例如,实时线程服从于实时线程调度程序。 调度程序提供独特的调度优先级范围,并且可以实施先进先出的实时调度策略(确保最高优先级的线程在不中断的情况下运行)以及优先级继承 (一种防止较低优先级的算法)线程无限期持有更高优先级的线程所需的锁,否则该线程将不受阻碍地运行(这种情况称为优先级倒置 )。

您可以在代码中显式构造RealtimeThread实例。 但是,也可以以最小的方式更改应用程序以启用实时线程,从而避免大量的开发工作和相关成本。 这里显示的是各种方式的示例,这些方式可以以最少的介入和最透明的方式启用实时线程。 (您可以下载本文所有示例的源代码。)这些技术使应用程序可以以最少的努力利用实时线程,并使应用程序与标准虚拟机保持兼容。

按优先级分配线程类型

清单1显示了一个代码块,该代码块根据优先级值分配实时或常规线程。 如果它在实时虚拟机上运行,​​则某些线程可以是实时线程。

清单1.根据优先级分配线程类
import javax.realtime.PriorityScheduler;
import javax.realtime.RealtimeThread;
import javax.realtime.Scheduler;

public class ThreadLogic implements Runnable {
    static void startThread(int priority) {
        Thread thread = ThreadAssigner.assignThread(
                priority, new ThreadLogic());
        thread.start();
    }

    public void run() {
        System.out.println("Running " + Thread.currentThread());
    }
}

class ThreadAssigner {
    static Thread assignThread(int priority, Runnable runnable) {
        Thread thread = null;
        if(priority <= Thread.MAX_PRIORITY) {
            thread = new Thread(runnable);
        } else {
            try {
                thread = RTThreadAssigner.assignRTThread(priority, runnable);
            } catch(LinkageError e) {}
            if(thread == null) {
                priority = Thread.MAX_PRIORITY;
                thread = new Thread(runnable);
            }
        }
        thread.setPriority(priority);
        return thread;
    }
}

class RTThreadAssigner {
    static Thread assignRTThread(int priority, Runnable runnable) {
        Scheduler defScheduler = Scheduler.getDefaultScheduler();
        PriorityScheduler scheduler = (PriorityScheduler) defScheduler;
        if(priority >= scheduler.getMinPriority()) {
            return new RealtimeThread(
                    null, null, null, null, null, runnable);
        }
        return null;
    }
}

清单1中的代码必须使用RTSJ类进行编译。 在运行时,如果找不到实时类,则代码将捕获虚拟机抛出的LinkageError并实例化常规Java线程来代替实时线程。 这允许代码在任何虚拟机上运行,​​无论是否实时。

在清单1中,提供RealtimeThread对象的方法被分为自己的类。 这样,只有在加载类时才验证该方法,这是在首次访问assignRTThread方法时完成的。 加载该类时,运行时虚拟机字节码验证程序将尝试验证RealtimeThread类是Thread类的子类,如果未找到RealtimeThread类,则该类将失败,并出现NoClassDefFoundError

使用反射分配线程

清单2演示了一种与清单1效果相同的替代技术。它从优先级值开始确定所需的线程类型,然后根据类名实例化实时或常规线程。 反射代码期望类中存在构造函数,该构造函数将java.lang.Runnable的实例作为最后一个参数,并为所有其他参数传递null值。

清单2.使用反射分配线程
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ThreadLogic implements Runnable {
    static void startThread(int priority) {
        Thread thread = ThreadAssigner.assignThread(
                priority, 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值