Tomando entrada em Java sem programa enforcamento?
-
21-08-2019 - |
Pergunta
Eu estava pensando como eu iria deixar meu programa java continuar em execução, mas sempre estar pronto para assumir de entrada.
Agora eu estou usando um bufferreader e leitura em uma linha, mas que faz minha parada programa e espera para a entrada. Eu quero o programa para continuar funcionando, mas estar pronto para receber a entrada sempre que necessário, há uma maneira de fazer isso?
Solução
Eu esperaria que você vai ter que olhar para multithreading sua aplicação, a fim de obter esse trabalho como você deseja.
Editar : É claro que, enquanto essa funcionalidade pode ser alcançado através de uma interface puramente CLI, você provavelmente seria melhor fora de explorar outras opções (isto é GUI opções) se você pretende ter uma resposta completa / sistema orientado a eventos em execução em uma forma com vários segmentos.
Outras dicas
Aqui está um exemplo rápido de como um aplicativo de interface de linha de comando de multi-threaded pode funcionar. Isso não vai exigir de votação para a entrada, nem uma interface GUI, a fim de executar tarefas em segundo plano enquanto se espera para a entrada de um usuário em um console.
Neste exemplo, um Thread
está sendo executado em segundo plano, o que pode ser dito para a saída de uma saudação em um número especificado de segundos mais tarde.
public class CommandLineMultiThread
{
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
// Makes and runs the background thread.
MyThread myThread = new MyThread();
Thread t = new Thread(myThread);
t.start();
// Get the number of seconds to wait from the console.
// Exit when "0" is entered.
int waitDuration;
do
{
waitDuration = s.nextInt();
myThread.setGreetIn(waitDuration);
} while (waitDuration != 0);
myThread.quit();
}
static class MyThread implements Runnable
{
boolean running = true; // Boolean to keep thread alive.
long greetingTime = Long.MAX_VALUE; // Time to greet at.
public void setGreetIn(int i)
{
greetingTime = System.currentTimeMillis() + (i * 1000);
}
public void quit()
{
running = false;
}
public void run()
{
while (running)
{
if (System.currentTimeMillis() > greetingTime)
{
System.out.println("Hello!");
greetingTime = Long.MAX_VALUE;
}
try
{
Thread.sleep(100);
}
catch (InterruptedException e) {}
}
}
}
}
A classe Scanner
pode ser usado para aceitar a entrada de utilizador a partir da interface de linha de comando através do encaminhamento a entrada a partir do rel System.in
objeto.
Em seguida, enquanto o myThread
segmento de segundo plano está em execução, o segmento principal está esperando por uma entrada de System.in
através do Scanner.nextInt
método. Uma vez que os segundos de espera foi aceite, a discussão de fundo é dito para esperar até um certo tempo, e uma vez que chega esse tempo, o Hello!
saudação é a saída para o console.
Eu acho que o programa terá que ocasionalmente votação para entrada do usuário.
Dê-lhe um GUI multi-rosqueada agradável em vez de um CLI:)
Concordo com James, outra alternativa é "fingir" programa contínuo em execução. Isso não vai funcionar com todos os cenários, mas você pode definir um direito temporizador antes de exibir a entrada do usuário, em seguida, calcular o tempo entre a parada e "start" novamente quando o usuário insere algo.
Use esse tempo para executar uma função repetido um determinado número de vezes. Esta é apenas útil se você tem algo em si mesmo um temporizador já, como uma constante drenagem inteiro a cada poucos segundos.
Um exemplo:
Você pergunta ao usuário uma pergunta mas apenas quer dar-lhes 5 segundos para resposta. Quando as respostas de usuários (acessos entrar) o programa irá calcular o tempo que levou-os a entrar, se muito tempo, lançar uma mensagem, se abaixo do limite de tempo de jogar outro.
Eu só estou sugerindo que este método porque threading, que é o que você realmente quer entrar, é bastante avançada.