Executar arquivos a medida que forem solicitados

Olá a todos, boa noite.
Pessoal minha dúvida é a seguinte:

  1. Imaginem que eu tenha uma Lista com alguns arquivos (File) onde estes estão ordenados por prioridade.
  2. Onde, quando percorro essa minha Lista sempre irei executar automaticamente o primeiro arquivo e os demais serão executados a medida em que eu for solicitando-os.

Porém, estou meio sem uma ideia concreta de como fazer isso.
Alguém poderia me dar um dica de como posso fazer isto?
Desde já obrigado pela ajuda de todos.

Usa uma PriorityQueue

[code]PriorityQueue arquivos = new PriorityQueue();
//…
//dai só ir chamando
String arquivo = arquivos.poll();

//ou

PriorityQueue arquivos = new PriorityQueue();
//…
//dai só ir chamando
Arquivo arquivo = arquivos.poll();
[/code]

Fora isso só usar IO para ler os arquivos.

EDIT

Exemplo com PriorityQueue
http://www.algorithmbase.com/258/java-priority-queue-example/
Tem muito mais … só dar uma “googlada”.

Olá asousaj, obrigado pela dica. Irei dar uma olhada em alguns exemplos pra ver ela se aplica ao meu caso.
Porém, deixando mais claro o que estou tentando fazer é o seguinte:
Imagine que eu tenha uma lista com o seguintes arquivo abaixo na respectiva ordem.

List<File> listaDePrioridade = new ArrayList<File>(); listaDePrioridade.add(new File("arquivo_1.xml")); listaDePrioridade.add(new File("arquivo_2.xml")); listaDePrioridade.add(new File("arquivo_3.xml"));
No momento em que eu estivesse percorrendo essa minha lista, gostaria que o primeiro arquivo b[/b] fosse executado automaticamente enquanto os demais ficassem aguardando alguma ação minha para serem executados. Isto, após minha primeira ação executasse o arquivo_2.xml, após outra ação executasse o arquivo arquivo_3.xml e assim sucessivamente.
Com PriorityQueue é possível fazer isso?

Desde já obrigado pela atenção.
Abraço

Hum… nada como escrever uma pergunta e a pessoa já ir respondendo algo que não é exatamente o que você quer.

Você já enquadrou os arquivos em uma determinada ordem qualquer. Só que quando se usa uma PriorityQueue, ele reordena a fila de acordo com um critério que depende do objeto usado (no seu caso, uma PriorityQueue irá ordenar os elementos por ordem do nome do arquivo, o que provavelmente não é o que você quer sempre.)

No seu caso, uma fila simples (java.util.Queue) é mais que suficiente. Use uma das classes que implementam a interface Queue:

http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html

Por exemplo, uma LinkedBlockingQueue ( http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html ) pode ser útil se você tiver uma thread que cria a lista dos arquivos, gradativamente, e outra thread que consome essa lista, gradativamente.

Esta correto entanglement, realmente a resposta não foi adequada.
Estarei mais atendo na próxima.

Certamente você está correto, mas aqui é um espaço pra discussão e vira e meche alguém pode cometer gafes com essa minha. Ainda bem que temos experts aqui para nos corrigir :D.

Justamente, pra ordenar os arquivos utilizo o algoritmo de busca em profundidade, uma vez que dentro do meus xml existe uma tag que define uma hierarquia entre eles.

No caso, você estar dizendo pra mim não utilizar uma List e sim uma Queue, correto?

[quote]http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html

Por exemplo, uma LinkedBlockingQueue ( http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html ) pode ser útil se você tiver uma thread que cria a lista dos arquivos, gradativamente, e outra thread que consome essa lista, gradativamente.
[/quote]
Pois é, também acho que terei que usar uma Thread, no entanto, terei que estuda-la primeiramente já que nunca usei Thread para resolver um determinado problema.
Conhece algum tutorial bom que ensine Thread?
Desde de já obrigado pela atenção.
Abraço.

Usar threads puras é como usar goto. Dá muito problema e pode ocasionar programas que são indebugáveis :slight_smile:
O correto é usar Futures, que são classes do pacote java.util.concurrent.

Não sei, pra começar, se seu problema precisa de processamento paralelo (um produtor, um consumidor).
Pode ser que nem precise disso, porque a velocidade para criar a lista dos arquivos seja muito maior que a velocidade do processamento deles - se for esse o o caso, uma lista simples é suficiente, e não precisa de threads.

[quote=entanglement]Não sei, pra começar, se seu problema precisa de processamento paralelo (um produtor, um consumidor).
Pode ser que nem precise disso, porque a velocidade para criar a lista dos arquivos seja muito maior que a velocidade do processamento deles - se for esse o o caso, uma lista simples é suficiente, e não precisa de threads.[/quote]
Pra criar a lista sem dúvidas é bem mais rápido do que o processamentos dos arquivos contidos nela.
O que me falta é uma lógica de como eu posso fazer pra executar o primeiro arquivo da lista e os demais fiquem aguardando alguma ação minha para que sejam executados, isto é, a cada ação, executar apenas um arquivo.
Por exemplo, voltemos para o exemplo da lista abaixo.

List<File> listaDePrioridade = new ArrayList<File>(); listaDePrioridade.add(new File("arquivo_1.xml")); listaDePrioridade.add(new File("arquivo_2.xml")); listaDePrioridade.add(new File("arquivo_3.xml"));
Para executa o primeiro arquivo é algo trivial, bastando fazer algo como o seguinte abaixo.

for (int i = 0; i < listaDePrioridade.size(); i++) { if (i == 0) { // Executo o primeiro arquivo da lista } else { // Aqui que não sei exatamente o que fazer para que fique aguardando uma ação minha pra que seja executado } }
Então, poderia me dar uma ideia sobre o que fazer dentro else?

Aguardar uma ação = apertar um botão em uma janela Swing ou SWT?

Se for isso, é necessário você aprender algo sobre “programação orientada a eventos”.

[quote=entanglement]Aguardar uma ação = apertar um botão em uma janela Swing ou SWT?

Se for isso, é necessário você aprender algo sobre “programação orientada a eventos”. [/quote]
Seria dar uma entrada via teclado (uma String), por exemplo, digitar alguma coisa como y = para confirmar ou n = para negar.
Onde, após minha confirmação b[/b], fosse executado o próximo arquivo.
Para tal seria necessário programação orientada a eventos?
Obrigado pela atenção entanglement.

Puxa, Jeovane, acompanho seus posts e parece que você é um sujeito bem teórico mesmo.

No seu caso, parece que você quer algo tão boboca quanto aqueles programinhas de começo de curso de Java, que são mais ou menos assim:

List<File> arquivos = gerarListaArquivosASeremProcessados();
Scanner sc = new Scanner (System.in);
for (File arquivo : arquivos) {
    System.out.printf ("Deseja processar o arquivo %s? Digite S ou N\n", arquivo);
    String resposta = sc.nextLine();
    if (resposta.trim().equalsIgnoreCase ("S")) {
         processar (arquivo);
    } else ... // puxa vida, aí é por sua conta :)
}

É mais ou menos isso?

caracoles…o tópico avançou do avançado para o básico

você nao gostaria de fazer isso ? esqueça os erros de sintaxe escrevi rapido para fins de estudo.

[code]for (int i = 0; i < listaDePrioridade.size(); i++) {

println(“deseja executar o arquivo: " + i + " y- sim, n- nao”);
a = scanner.getLine()…
if (a = “y”){
//executa arquivo
}
else {
continue; // avança para o proximo, ou break para sair…
}

}[/code]

De modo geral, não se sinta envergonhado por isso. Quando a gente escreve um monte de algoritmos complexos, acaba se esquecendo das coisas simples.

Por exemplo, é bem chatinho você escrever certas coisas em Haskell que em Java são trivialmente simples - tipicamente são aquelas coisas que envolvem “monads” etc. em Haskell. Estou supondo que você seja um programador Haskell :slight_smile:

Ir para esse básico do básico foi necessário, no entanto, não será esse o produto “final”. Eu sabia/sei da existência do Scanner sc = new Scanner e que ele pode/poderia ser utilizado. No entanto, imaginei que de repente pudesse existir algo mais elegante para executar tais eventos.

O produto final, será algo como: Imaginem que dentro de cada arquivo xml existam alguns dados e que após este arquivo ser submetido será criada uma consulta SPARQL de acordo com os parâmetros contidos em cada xml.

A necessidade de executar o primeiro arquivo logo de imediato é que este apresentara em uma tabela (página web) os primeiros resultados da consulta, onde de acordo com a navegação (cliques) sobre um determinado resultado contido na tabela, irei pegar esse resultado clicado e então executar o próximo arquivo.

Seria algo como: Imaginem que no meu primeiro arquivo xml seja criada uma consulta onde apresente algumas doenças e que após você clicar em uma dessas doenças seja apresentada uma lista de drogas utilizada para o tratamento desta doença. E que após clicar em uma determinada droga seja apresentada algumas informações referentes a esta, como: efeitos colaterais, ingrediente, fórmula química, ingrediente ativo e etc.

Acima é apenas um exemplo, no entanto, a aplicação final poderá ser utilizada para qualquer fim, desde que o objetivo seja a integração de dados contidos em diferentes fontes semanticamente integradas.

[quote=jeovane.reges]Ir para esse básico do básico foi necessário, no entanto, não será esse o produto “final”. Eu sabia/sei da existência do Scanner sc = new Scanner e que ele pode/poderia ser utilizado. No entanto, imaginei que de repente pudesse existir algo mais elegante para executar tais eventos.

O produto final, será algo como: Imaginem que dentro de cada arquivo xml existam alguns dados e que após este arquivo ser submetido será criada uma consulta SPARQL de acordo com os parâmetros contidos em cada xml.

A necessidade de executar o primeiro arquivo logo de imediato é que este apresentara em uma tabela (página web) os primeiros resultados da consulta, onde de acordo com a navegação (cliques) sobre um determinado resultado contido na tabela, irei pegar esse resultado clicado e então executar o próximo arquivo.

Seria algo como: Imaginem que no meu primeiro arquivo xml seja criada uma consulta onde apresente algumas doenças e que após você clicar em uma dessas doenças seja apresentada uma lista de drogas utilizada para o tratamento desta doença. E que após clicar em uma determinada droga seja apresentada algumas informações referentes a esta, como: efeitos colaterais, ingrediente, fórmula química, ingrediente ativo e etc.

Acima é apenas um exemplo, no entanto, a aplicação final poderá ser utilizada para qualquer fim, desde que o objetivo seja a integração de dados contidos em diferentes fontes semanticamente integradas.[/quote]

não quiz menospreza-lo, quantas vezes ja não me perdi com um " ; " fechando um if ^^

a sua estrutura me parece um relacionamento 1-N, você pretente fazer uma integração com webservices ?

Que é isso douglaskd, não se passou em momento algum isso por minha cabeça :smiley: … as vezes precisamos de um empurrãozinho pra desengatilhar certos problemas que enfrentamos no dia-a-dia.

Irei usar webservices sim, a diferença é que não estou trabalhando com banco de dados relacionais e sim com bases de dados RDF. Por isso esta melhor flexibilização nos relacionamentos entre diferentes fontes.