Java Real Time como começar?

Alguém já fez um aplicativo real time em java? Estou apanhando feio para este assunto e queria saber se algum de vocês pode me ajudar a encontrar o caminho certo. Estou querendo desenvolver um programa para controlar um motor de passo, ok ele já está feito e funciona, o único problema é que não consigo alcançar uma precisão de microsegundos nos timers de espera entre os pulsos do motor. Então pesquisando descobri que precisaria mudar para um sistema RTOS e outras coisas que já começaram a complicar :slight_smile: . Eu já tentei recompilar um kernel do linux com o path rt para poder fazer aplicações real time, só que não me sai muito bem. Pesquisando mais um pouco descobri que com java é possivel alcançar real time tbm, só nao entendi como isso serial possivel se precisaria de um sistema tbm e se a solução é open-source (free) ou eu teria que pagar pra poder fazer isso.
Obrigado!

O seu problema está em dar um sleep pequeno o suficiente?

Ou o seu problema está em efetuar o cálculo em tempo hábil?

Se for o primeiro caso: Em Java você pode usar o Thread.sleep(ms, ns) que recebe um tempo em milisegundos, mais uma quantidade de nanosegundos. No caso você passaria no ms o valor 0, e no ns a quantidade de microsegundos que voce precisaria (em nanosegundos).
Esse método está sujeito as configurações de timer da máquina, então é bem possível que tenha que fazer atualizações no SO. E bem provavelmente no garbage colector/jvm também.

Se for o segundo caso: Terá que otimizar o algoritmo e/ou usar uma máquina mais potente. Se você evitar criar objetos e usar arrays (de tipos primitivos) para tudo, pode te ajudar com isso. Tente reaproveitar os arrays criados inclusive.

Não sei se consegui dar alguma luz, não sou especialista no assunto.

Você precisa usar uma jvm de baixa latência para resolver o seu problema. A oracle possui a jrockit.

JRockit não sofre tanto com congelamentos causados pelo coletor de lixo da máquina virtual mas não é gratuita para projetos que visam lucros.

http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html

O seu problema é que você necessita de precisão de respostas em tempos muito curtos. Pra baixo da casa dos 10 ms e entrando nos us essa jvm já não pode mais te ajudar.

Isso mesmo julio, o meu problema é que preciso de um timer que tenha precisão de 10 us, algo impossível de conseguir com o Thread.sleep(). Eu to pensando em usar código em C/C++ com JNI pra conseguir isso em um sistema RTLinux. Eu sei que esse fórum é de java, mas se alguém souber algum exemplo de Real Time Software em um RTLinux seria de grande ajuda :slight_smile: .

Por que não usa C++ direto? Ou só C mesmo?

Se você está com restrições tão sérias de tempo, está na linguagem errada.

Você tem razão Vini, eu só optei pelo java por ele ser mais “fácil” e por eu ter mais experiência com ele, mas pelo jeito o trabalho que eu teria pra fazer ele funcionar não valeria a pena.

Pois é, se for usar JNI, fica mais difícil do que simplesmente usar o C++ direto.

Você consegue com a jrockit. Já resolvi um problema semelhante simplesmente trocando a jvm.