У синтаксического анализатора ANTLR действительно нет понятия правила запуска - вы можете выбрать любое правило в качестве правила запуска при его вызове (вызывая соответствующий метод, например, start()
, если вы хотите начать с правила [ 111]).
Это может быть полезно, если вам нужно начать с разных правил для разных вариантов использования.
Возможно, было бы хорошей идеей называть ваше правило запуска что-то вроде startRule
в вашей грамматике для удобства чтения, но это не обязательно.
Java NIO поддерживает файлы с отображением в памяти. Если несколько карт памяти JVM отображают один и тот же файл, они могут использовать его как разделяемую память.
Вот пример отображения памяти файла.
try {
int shmSize = 1024;
RandomAccessFile file = new RandomAccessFile("shm.raw","rw");
// inialize file size
if(file.length() < shmSize) {
byte[] tmp = new byte[shmSize];
file.write(tmp);
file.seek(0); // seek back to start of file.
}
// memory-map file.
FileChannel ch = file.getChannel();
MappedByteBuffer shm = ch.map(FileChannel.MapMode.READ_WRITE, 0, shmSize);
ch.close(); // channel not needed anymore.
shm.load(); // force file into physical memory.
// now use the ByteBuffer's get/put/position methods to read/write the shared memory
} catch(Exception e) { e.printStackTrace(); }
В Linux вы можете создать файл shm.raw в / dev / shm / a файловая система на основе памяти. Это поможет избежать дискового ввода-вывода.
Подробнее читайте в этой статье Введение в сопоставленный с памятью ввод-вывод в Java
Также вам все равно понадобится способ синхронизировать чтение / запись в разделяемую память. JVM отправителя должен будет сигнализировать JVM получателя, когда будет написано полное сообщение.
Использование Java NIO ' SocketChannel может быть лучше для небольших сообщений, так как получатель может быть уведомлен о получении сообщения. Совместно используемая память действительно помогает только при отправке больших сообщений.
Для IPC между JVM на разных машинах попробуйте JIPC
Я бы предложил вам взять посмотрите на Терракотовая . Я не знаю, будет ли это соответствовать вашим требованиям, потому что главная цель Terracotta - плавная масштабируемость («api» - это просто доступ к памяти), но у него, безусловно, есть модуль интеграции обмена сообщениями. Это с открытым исходным кодом.
Приветствия.