Threads - escalonamento Round-Robin

Ai galera beleza ?

Preciso fazer um algoritimo que vai executar operações, com thread, e ele precisa usar o escalonamento Round-Robin, alguém tem idéia de como fazer com Java ou já fez. Apenas algumas orientações ou dicas …

Pois pelo que sei Round-Robin pega um processo de uma fila que fica em memória (readList) e executa o primeiro processo dessa fila, após um determinado tempo se esse processo não acabou ele sai de execução e vai para o final da fila e entra o próximo processo da fila e assim vai indo até o final. Caso antes desse tempo determinado a execução acabar ele lê o primeiro arquivo do mesmo jeito, claro :slight_smile:

O que vou fazer: Bom minha classe que vai implementar a thread vai ficar lendo arquivos e em cima desses arquivos vai executar operações de soma, subtração, divisão entre outros …

O que penso em fazer: Bom criar uma lista que vai armazenar em ordem os arquivos que vou executar, pego o primeiro e começo a execução, executa, pego o segundo e assim vai.

Minha dúvida: Quanto ao escalonamento Round-Robin que preciso usar, se eu pegar o meu primeiro arquiivo, mandar para execução e o tal tempo de execução que eu vou setar expirou e ele nao terminou a minha execução, o que faço para deixar essa thread parada, ir para o final da fila, camar outro da fila, vou ter que inserir a que eu parei de novo no final da fila e ainda ela vai ter que guardar todos os valores de operações que fez sem perder eles para quando terminar me imprimir isso, e assim vai indo se outras pararem, o Java trata isso como, alguém poderia me dar uma luz :slight_smile:

Muito obrigado
Abraços

Jr

Olá

Usa logo o java.nio. Estude os conceitos de selector e channels.

[]s
Luca

[quote=Luca]Olá

Usa logo o java.nio. Estude os conceitos de selector e channels.

[]s
Luca[/quote]

Fala Luca, beleza :slight_smile:

Tranquilo a classe que lê esse arquivo e todo o método de leitura já está pronto, a dúvida é quanto a joaga das threads e como vai funcionar essa parte de se pausar a thread ela continuar mantendo os valores :slight_smile:

Duvida Exemplo: Se eu tenho dois atributos double que ele vai ficar somando e essa thread for pausada e recontinuar depois, ele nao perde os valores que ele ja tinha calculado ? Eu declaro isso na própria classe que implementa threads ?

Isso que é minha duvida :slight_smile:

valeu

Se vc usar o Thread.sleep(), ela não perde os valores, pois você estará apenas colocando ela em espera.
Mais se você quiser, pode usar tb o ObjectOutputStrem, e serializar seu objeto com os valores quando mandar para a thread. Dessa maneira vc usa uma única thread para fazer o seu algorítimo, e vai colocando os valores na fila e tirando através de serialização de objetos.
Dado que vc só vai processar uma operação de cada vez, acho que seria a melhor solução.

Perdão, não em espera, mais para dormir.

Olá

Porque razão colocar um thread em espera limparia a memória? Uma Thread é uma classe como outra qualquer, só limpa as variáveis membro se for para o GC.

Dê uma reestudada em Threads. Sempre é bom e de vez em quando eu faço isto. Entenda que as threads compartilham a memória mas como os compoutadores usam registradores, há variáveis que para serem atualizadas na memórias precisam ser declaradas com um modificador especial.

Java.nio faz o que você quer melhor e mais fácil. Nunca trabalhe com IO sem verificar o que java.nio pode fazer por você.

[]s
Luca

Perdão, não em espera, mais para dormir.[/quote]

E ai sapulha beleza ? Valeu o post ai :slight_smile:

Bom pelo que entendi que você falou, vou ter uma classe ProcessaArquivos que vai implementar Runnable e no meu método run vou ter a implementação que vai ler um arquivo que contém codigos que vou interpretar e fazer operações de soma, divisão, etc …
Você quer que eu passe então um Objeto ? Tipo Crio uma classe com duas váriavesi double, soma e operacoes por exemplo, e mando essa Classe pro meu ProcessaArquivos ? E fico armazenando os resultados das operações nela, caso eu de o thread.sleep …? Uma o meu método da classe ProcessaArquivos libera para execução de outra thread se for synchronized ? Mas pode nao ser de repente nao vai precisar …

Ai é só eu chamar outro processo da fila e mandar rodar esse outro cara em uma nova thread ? Tipo dou lá o new ProcessaArquivos(MinhaClasse classe) passando outro objeto para ele(Daquele que vai ter dois double para rmazenar os resultados das operacoes) com o novo arquivo a ser lido ?
E quando a fila continuar andando e chegar naquele cara que eu dei o sleep eu vou precisar do que, so nome da thread ? Por que pensei em armazenar apenas o nome do arquivo que vou ler nessa lista que será a fila de arquivos a serem executados, acho que vou ter que armazenar mais informacoes nele por que como vou saber se aquele arquivo ja estava sendo processado e dei um sleep nele entende ?

espero que entenda :slight_smile:
Valeu
Jr

[quote=Luca]Olá

Porque razão colocar um thread em espera limparia a memória? Uma Thread é uma classe como outra qualquer, só limpa as variáveis membro se for para o GC.

Dê uma reestudada em Threads. Sempre é bom e de vez em quando eu faço isto. Entenda que as threads compartilham a memória mas como os compoutadores usam registradores, há variáveis que para serem atualizadas na memórias precisam ser declaradas com um modificador especial.

Java.nio faz o que você quer melhor e mais fácil. Nunca trabalhe com IO sem verificar o que java.nio pode fazer por você.

[]s
Luca[/quote]

Oi Luca, valeu cara … a minha duvida é somente quanto ao que falei de saber onde eu coloco esses atributos. Posso criar uma classe ProcessaArquivos recebendo dois double ai começo a ler o arquivo e atribuir os valores certo ? Ai eu do o sleep e mando rodar outro arquivo passando novos valroes … ai tah errado correto ? ele vai perder os valores da outra thread já que estão como parametro …

Acho que o que o sapulha quis dizer é para eu passar uma Classe com esses dois atributos toda vez que chamar a classe que implementa a thread … e ficar trabalhando com ela …
Se for isso so to pensando se quando ele nao terminar em 10 segundos por exemplo a execucao e voltar para o final da fila, como depois vejo que aquele arquivo da minha fila já foi para execucao e está pausado ?
Desculpa se for a maior besteira do mundo, mas por cima pensando rapido acho que vou ter que criar uma hastable com o nome do arquivo seguido do nome da thread, se o nome da thread for nulo sinal que nao foi executado ainda … nao sei …

abraços
valeu

Cara, vc pode fazer o seguinte:

Crie um Thread que vai ler seu arquivo de fila.
Crie um objeto onde vc guardará os valores de parametros de cada execução da fila.
Quando vc estiver executando uma operção e o tempo espirar, serialize esse objeto em forma de arquivo (dê uma olhada em ObjectOutputStream e ObjectInputStream) com um nome único e coloque o nome desse arquivo no seu arquivo de fila.
Quando a fila voltar a este arquivo, vc lerá o objeto serializado, que estará com todos os valores armazenados como no momento em que vc serializou.
Daí vc continua o processamento, e se precisar parar, serializa denovo, entendeu?

É meio complicado, mais acho que é melhor do que trabalhar com Thread.sleep() e Thread.wait(), pois nesses casos vc terá que tomar muito cuidado com a concorrência.

[quote=sapulha]Cara, vc pode fazer o seguinte:

Crie um Thread que vai ler seu arquivo de fila.
Crie um objeto onde vc guardará os valores de parametros de cada execução da fila.
Quando vc estiver executando uma operção e o tempo espirar, serialize esse objeto em forma de arquivo (dê uma olhada em ObjectOutputStream e ObjectInputStream) com um nome único e coloque o nome desse arquivo no seu arquivo de fila.
Quando a fila voltar a este arquivo, vc lerá o objeto serializado, que estará com todos os valores armazenados como no momento em que vc serializou.
Daí vc continua o processamento, e se precisar parar, serializa denovo, entendeu?

É meio complicado, mais acho que é melhor do que trabalhar com Thread.sleep() e Thread.wait(), pois nesses casos vc terá que tomar muito cuidado com a concorrência.[/quote]

Beleza vou dar uma olhada nessa situação que você me passou, mas é que pensei em usar synchronized no método que lê arquivos, mas na verdade eu posso ter na minha situação até 4 processos rodando juntos ;(
ou seja 4 threads …

valeus

Olá

Sapulha, ou eu estou comendo mosca ou você está complicando demais.

Fsjr, se ainda tem dúvidas se precisa sincronizar ou náo o método que lê os arquivos, então realmente precisa parar tudo e reler sobre threads.

[]s
Luca

[quote=Luca]Olá
Sapulha, ou eu estou comendo mosca ou você está complicando demais.
[/quote]

Não acho que esteja complicando Luca, é que trabalhar com multi-thread quando se tem dificuldade em entender os conceitos de concorrência e semáforo é dose.

Achei que utilizando uma única thread para implementar o algorítimo, e separar as funções em objetos serializados poderia ser uma opção.

Digo isso pq penei bastante antes de entender o funcionamento correto das threads, e sei que muita gente tem dificuldade.

Mais claro que a solução com multi-threads é bem mais elegante… :smiley:

[quote=Luca]Olá

Sapulha, ou eu estou comendo mosca ou você está complicando demais.

Fsjr, se ainda tem dúvidas se precisa sincronizar ou náo o método que lê os arquivos, então realmente precisa parar tudo e reler sobre threads.

[]s
Luca[/quote]

Ai Luca, blz :slight_smile:

É pelo que entendi até agora, não vou precisar não, até pq posso ter 4 processos rodando e estes processos são arquivos diferentes e instâncias diferentes onde eu vou armazenar os valores das operações :slight_smile:
Só preciso controlar para executar 4 threads somente por vez :slight_smile:

[]´s
:slight_smile:

[quote=sapulha][quote=Luca]Olá
Sapulha, ou eu estou comendo mosca ou você está complicando demais.
[/quote]

Não acho que esteja complicando Luca, é que trabalhar com multi-thread quando se tem dificuldade em entender os conceitos de concorrência e semáforo é dose.

Achei que utilizando uma única thread para implementar o algorítimo, e separar as funções em objetos serializados poderia ser uma opção.

Digo isso pq penei bastante antes de entender o funcionamento correto das threads, e sei que muita gente tem dificuldade.

Mais claro que a solução com multi-threads é bem mais elegante… :smiley: [/quote]

Quando você diz uma única thread, nçao entendi, por que é claro que vou ter so uma thread (Quando digo isso é que vou te3r uma unica classe que estender Runnable e no método run vai ler o arquivos e fazer as operações :slight_smile:

Nao posso fazer assim:

So exemplo nao sei como seria o nome mas é de menso tb …
Tipo uma classe Atributos.java

dentro dela posso ter uma List, por que ? Ah por que posso ter N operacaoes e valores.

Atributos a = new Atributos();

private Double acumulador; //Vai guardar o valor depois de cada operacao
private Lit operacoesValores; Guarda as operacoes e valores

ai seto ela:

setOperacoesValores(Lista que criei lendo o arquivo);

Ai

Thread[] t = new Thread[4];
t[i] = new Thread(a);
t[i].setName(nomeDoArquivo);
t[i].start();

Dentro do run da thread eu fico fazendo um for no arquivo fazendo suas operacoes. Caso acabe se eu der um sleep nela depois posso pegar ela pelo nome da thread ne ? Tipo como eu defini o nome da thread como sendo o nome do arquivo posso ai em cada arquivo que for ler da fila verificar se aquela thread existe, nao sei como mas deve da claro :slight_smile: vi q o isAlive() retorna se ela ainda esta executando mas nao sei se tiver em sleep retorna tru tb pra ver se ela existe …

[]´s