Thread e join()

1 resposta
LuanMesquita

Iae galera, estou com um código más não estou conseguindo
entender e estou ficando louco com isso, por favor me ajudem
a entender esse código. Irei colocando minhas dúvidas ao lado do código como
comentário e irei númerar.

Tenho essa classe:

public class ProduzSQL implements Runnable{
private int comeco;
private int fim;
private Collection<String> sqls;
public ProduzSQL(int comeco, int fim, Collection<String> sqls) {
this.comeco = comeco;
this.fim = fim;
this.sqls = sqls;
}
public void run() {
for (int i = comeco; i < fim; i++) {
sqls.add("SQL"+i);
}
}
}

Até aqui está tudo bem. Tenho essa outra classe e muitas dúvidas.

public class BancoDeDados {
public static void main(String[] args) throws InterruptedException // 1) Porque gerou essa Exception? {

Collection<String> sqls = new HashSet<String>();

ProduzSQL p1 = new ProduzSQL(0, 100, sqls);
Thread t1 = new Thread(p1);
ProduzSQL p2 = new ProduzSQL(100, 200, sqls);
Thread t2 = new Thread(p2);
ProduzSQL p3 = new ProduzSQL(200, 300, sqls);
Thread t3 = new Thread(p3);

t1.start(); 
t2.start();
t3.start();

t1.join(); 2) Queria saber qual o efeito que causa os joins()?
t2.join(); 3) E porque dar um pause na thread main até que as 3 threads sejam finalizadas? qual o motivo disso?
t3.join();

System.out.println("Threads produtoras de SQLs finalizadas!");

for (int i = 0; i < 400; i++) {
if (!sqls.contains("SQL" + i)) { 
// 4) Outra coisa, porque eu consigo acessar os valores de $sqls? já que os valores são de cada objeto? se eu fizesse algo parecido com uma String não iria conseguir fazer isso
throw new IllegalStateException("não encontrei a SQL" + i);
}
}

if (sqls.contains(null)) {
throw new IllegalStateException("não devia ter null aqui dentro! nao inserimos null");
}
System.out.println("Fim da execucao com sucesso"); // 5)Porque essa mensagem nunca aparece?
}
}

Irei ficar muito agredecido com as respostas para as minhas dúvidas.
Vlw pessoal.

abração

1 Resposta

E

Bem…vamos por partes…

  1. InterruptedException pelo que percebi não é gerada…mas vc precisa trata-la com um try-cacth ou a declarar porque o metodo join() lança essa exceção

  2. Vc possui 4 threads…sendo t1,t2,t3…e a propria thread main…quando vc chama o metodo join() na instancia de alguma das threads vc esta dizendo para a thread main
    espere essa thread terminar para poder continuar…nesse momento pode ser gerada uma InterruptedException se a Thread main voltar a execultar antes da thread que vc chamou join terminar o seu trabalho.

  3. Porque vc a Thread main poderia chegar no for que intera no objeto sqls antes que as outras threads tivessem terminado seu trabalho ate mesmo antes que qualquer uma da outras thread tivesse feito qualquer coisa…percebe?

  4. Vc consegui sim interar sobre os objeto sem problema…oq acontece é que na sua logica vc diz se NÂO conter a string “SQL” + i lança uma exceção…onde seu indice i
    vai de 0 a 399 e onde o valor maximo que a que vc passa no construtor da thread t3 e 300 ou seja quando vc pergunda se contem a string “SQL301” a excetion e lançada como previsto. Perceba que as três threads estão interadno sobre soble a MESMA collection não e possivél gerantir que uma será execultada depois da outra na ordem que foram iniciadas…percebeu?? E msmo que fossem as coleções SET não aceitam valores repetidos que oq vc esta tentando inserir.

  5. Por causa do que eu expliquei no item 4 é lançada uma exception e programa para ai.

Espero ter esclarecido as duvidas…

Criado 1 de março de 2011
Ultima resposta 1 de mar. de 2011
Respostas 1
Participantes 2