• Nenhum resultado encontrado

A classe BaSSThread

, a qual permite a execução de comandos do método

threads. Por se tratar de uma classe abstrata, para se instanciar um objeto com as funcionalidades da BaSSThread

métodos abstratos init(), main()

Esses métodos fazem parte do ciclo de vida da sempre é executado no início da simulação, antes q tempo de simulação seja realizada.

realizarem configurações iniciais no objeto antes do início da simulação. Como podem existir BaSSThreads na simulação e no início todos os relógios estão zerados, então a ordem

métodos init() prioridades (atributo priority).

Figura 4.24

Após a execução do método simulação, todas elas são bloqueadas pelo

começa a ser executado. Dentro do método

sincronizar a execução dos comandos com os

criadas quatro tipos de barreiras, estabelecidas a partir dos métodos BaSS

Estrutura e ciclo de vida de uma

BaSSThread foi desenvolvida tendo como base a classe , a qual permite a execução de comandos do método

. Por se tratar de uma classe abstrata, para se instanciar um objeto com as BaSSThread é preciso que seja definida uma subclasse que imple

main() e finalize()

Esses métodos fazem parte do ciclo de vida da sempre é executado no início da simulação, antes q

tempo de simulação seja realizada. A utilidade desse método reside na possibilidade de se realizarem configurações iniciais no objeto antes do início da simulação. Como podem existir na simulação e no início todos os relógios estão zerados, então a ordem

init() de cada

Figura 4.24 – Ciclo de vida de uma

Após a execução do método simulação, todas elas são bloqueadas pelo

começa a ser executado. Dentro do método main()

sincronizar a execução dos comandos com os

criadas quatro tipos de barreiras, estabelecidas a partir dos métodos BaSS – Um framework

Estrutura e ciclo de vida de uma

foi desenvolvida tendo como base a classe , a qual permite a execução de comandos do método

. Por se tratar de uma classe abstrata, para se instanciar um objeto com as é preciso que seja definida uma subclasse que imple

finalize().

Esses métodos fazem parte do ciclo de vida da sempre é executado no início da simulação, antes q

A utilidade desse método reside na possibilidade de se realizarem configurações iniciais no objeto antes do início da simulação. Como podem existir na simulação e no início todos os relógios estão zerados, então a ordem

de cada BaSSThread

Ciclo de vida de uma

Após a execução do método init() simulação, todas elas são bloqueadas pelo BaSSControl

começa a ser executado.

devem ser criadas as barreiras temporais para sincronizar a execução dos comandos com os comandos das outras

criadas quatro tipos de barreiras, estabelecidas a partir dos métodos

framework para o desenvolvimento de simuladores

Estrutura e ciclo de vida de uma BaSSThread

foi desenvolvida tendo como base a classe , a qual permite a execução de comandos do método run()

. Por se tratar de uma classe abstrata, para se instanciar um objeto com as é preciso que seja definida uma subclasse que imple

Esses métodos fazem parte do ciclo de vida da sempre é executado no início da simulação, antes q

A utilidade desse método reside na possibilidade de se realizarem configurações iniciais no objeto antes do início da simulação. Como podem existir na simulação e no início todos os relógios estão zerados, então a ordem BaSSThread segue a ordem decrescente de suas

Ciclo de vida de uma BaSSThread

de todas as

BaSSControl. A partir do primeiro desbloqueio, o

devem ser criadas as barreiras temporais para comandos das outras

criadas quatro tipos de barreiras, estabelecidas a partir dos métodos

para o desenvolvimento de simuladores

BaSSThread

foi desenvolvida tendo como base a classe

run() de forma pseudo

. Por se tratar de uma classe abstrata, para se instanciar um objeto com as é preciso que seja definida uma subclasse que imple

Esses métodos fazem parte do ciclo de vida da BaSSThread

sempre é executado no início da simulação, antes que qualquer atualização no A utilidade desse método reside na possibilidade de se realizarem configurações iniciais no objeto antes do início da simulação. Como podem existir na simulação e no início todos os relógios estão zerados, então a ordem segue a ordem decrescente de suas

BaSSThread.

de todas as BaSSThreads

. A partir do primeiro desbloqueio, o

devem ser criadas as barreiras temporais para comandos das outras BaSSThreads

criadas quatro tipos de barreiras, estabelecidas a partir dos métodos wait( BaSSTime time ) para o desenvolvimento de simuladores

foi desenvolvida tendo como base a classe Thread do pacote de forma pseudo-

. Por se tratar de uma classe abstrata, para se instanciar um objeto com as é preciso que seja definida uma subclasse que implemente os BaSSThread (Figura 4.24). O ue qualquer atualização no A utilidade desse método reside na possibilidade de se realizarem configurações iniciais no objeto antes do início da simulação. Como podem existir na simulação e no início todos os relógios estão zerados, então a ordem segue a ordem decrescente de suas

BaSSThreads presentes na . A partir do primeiro desbloqueio, o

devem ser criadas as barreiras temporais para BaSSThreads

wait( BaSSTime time ) para o desenvolvimento de simuladores

do pacote -paralela . Por se tratar de uma classe abstrata, para se instanciar um objeto com as mente os Figura 4.24). O ue qualquer atualização no A utilidade desse método reside na possibilidade de se realizarem configurações iniciais no objeto antes do início da simulação. Como podem existir na simulação e no início todos os relógios estão zerados, então a ordem segue a ordem decrescente de suas

presentes na . A partir do primeiro desbloqueio, o

devem ser criadas as barreiras temporais para BaSSThreads. Foram wait( BaSSTime time ),

waitUntil( BaSSTime time ), waitSignal() e waitForever().

O método wait( BasSSTime time ) determina um certo intervalo de tempo de simulação para a criação da próxima barreira temporal. Assim, deve-se passar como parâmetro um objeto da classe BaSSTime (ou uma subclasse desta), como por exemplo wait( new BaSSStandardTime( "00:01:00" ) ), que faz com que uma barreira seja criada 1s adiante no tempo, a partir do tempo de simulação atual (simulation_time + 1s). Esse intervalo de tempo está relacionado ao tempo utilizado no processamento dos comandos imediatamente anteriores à barreira estabelecida (o mesmo raciocínio explorado no item 4.4.3).

O método waitUntil( BaSSTime time ) também recebe um objeto do tipo BaSSTime (ou subclasse desta), contudo o tempo fornecido como parâmetro especifica o instante temporal da próxima barreira e não um intervalo de tempo até lá. O comando waitUntil( new BaSSStandardTime( "00:04:32" ) ) cria uma barreira temporal no instante 4 minutos e 32 segundos. Deve-se ressaltar, nesse caso, que se a barreira temporal criada tiver um instante temporal que já ocorreu no tempo de simulação, isto é, o instante fornecido como parâmetro é menor ou igual ao atributo simulation_time, a barreira não é criada e o objeto continua a sua execução como se nenhum comando de barreira existisse.

O terceiro método de barreira, waitSignal(), faz com que a BaSSThread fique bloqueada até que algum objeto chame o método signal(). Trata-se, portanto, de uma barreira não-temporal, uma vez que o seu desbloqueio não depende do tempo de simulação, mas sim de uma ação externa (provinda de outro objeto) que resulte na chamada do método signal() do objeto bloqueado.

A quarta e última forma de se criar uma barreira é através do método waitForever(). Este método faz com que a BaSSThread fique bloqueada indeterminadamente, sendo útil nos casos em que a BaSSThread não executa nenhum comando no método main(), mas precisa estar “viva” para atender à chamadas de interrupções ou temporizadores.

Quando o método main() é executado até o final, o ciclo de vida da BaSSThread atinge o seu último estágio, no qual são executados os comandos do método finalize(). Trata-se de um método análogo ao init(), mas sendo executado no final da execução dos comandos da BaSSThread. A utilização de qualquer método de barreira tanto dentro do método finalize() como dentro do método init() é proibitiva.

A Figura 4.25 apresenta o exemplo da classe BThread01, implementação de uma BaSSThread, na qual são definidos os métodos init(), main() e finalize(). Os “comandos” da simulação presentes são métodos que imprimem na tela (System.out.println()) o tempo

Capítulo 4 BaSS – Um framework para o desenvolvimento de simuladores de simulação (super.getControl(). getSimulationTime().toString()), o nome da BaSSThread e uma letra.

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import br.eng.rsalustiano.bass.BaSSThread; import br.eng.rsalustiano.bass.BaSSControl; import br.eng.rsalustiano.bass.BaSSStandardTime; public class BThread01 extends BaSSThread {

public BThread01( String name, int priority ) {

super( name );

super.setPriority( priority ); }

public void init() {

System.out.println( super.getControl().getSimulationTime().toString() + " " + super.getName() + " A" );

}

public void main() {

System.out.println( super.getControl().getSimulationTime().toString() + " " + super.getName() + " B" );

System.out.println( super.getControl().getSimulationTime().toString() + " " + super.getName() + " C" );

super.wait( new BaSSStandardTime( "00:01:00" ) );

System.out.println( super.getControl().getSimulationTime().toString() + " " + super.getName() + " D" );

super.wait( new BaSSStandardTime( "00:02:30" ) );

System.out.println( super.getControl().getSimulationTime().toString() + " " + super.getName() + " E" );

super.wait( new BaSSStandardTime( "00:05:00" ) );

System.out.println( super.getControl().getSimulationTime().toString() + " " + super.getName() + " F" );

super.wait( new BaSSStandardTime( "00:01:30" ) );

}

public void finalize() {

System.out.println( super.getControl().getSimulationTime().toString() + " " + super.getName() + " G" ); System.out.println( super.getControl().getSimulationTime().toString() + " " + super.getName() + " H" ); } }

Figura 4.25 – Definição da classe BThread01.

01 02 03 04 05 06 07

public static void main( String args[] ) {

BaSSControl bt = new BaSSControl( BaSSStandardTime.class );

bt.addThread( new BThread01( "TH1", 0 ) );

bt.addThread( new BThread01( "TH2", 0 ) );

bt.addThread( new BThread01( "TH3", 0 ) );

bt.start(); }

Figura 4.26 – Método main() que realiza a criação de uma simulação com três objetos da classe BThread01 e executa a simulação.

00:00:00.000 TH1 A 00:00:00.000 TH2 A 00:00:00.000 TH3 A 00:00:00.000 TH1 B 00:00:00.000 TH1 C 00:00:00.000 TH2 B 00:00:00.000 TH2 C 00:00:00.000 TH3 B 00:00:00.000 TH3 C 00:01:00.000 TH1 D 00:01:00.000 TH2 D 00:01:00.000 TH3 D 00:03:30.000 TH1 E 00:03:30.000 TH2 E 00:03:30.000 TH3 E 00:08:30.000 TH1 F 00:08:30.000 TH2 F 00:08:30.000 TH3 F 00:10:00.000 TH1 G 00:10:00.000 TH1 H 00:10:00.000 TH2 G 00:10:00.000 TH2 H 00:10:00.000 TH3 G 00:10:00.000 TH3 H

Figura 4.27 – Execução (saída na tela) da simulação criada na Figura 4.26.