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.