Thread: boa questão

[code]public class MyThread extends Thread
{
String myName;

MyThread(String name)
{
myName = name;
}

public void run()
{
for(int i=0; i<100;i++)
{
System.out.println(myName);
}
}

public static void main(String args[])
{
try
{
MyThread mt1 = new MyThread("mt1");
MyThread mt2 = new MyThread("mt2");
mt1.start();
// XXX
mt2.start();
}
catch(InterruptedException ex)
{
}
}
}[/code]

Possible answers:

A. The above code in its current condition will not compile.

B. In order to make the MyThread class print “mt1” (100 times) followed by “mt2” (100 times), mt1.join(); can be placed at //XXX position.

C. In order to make the MyThread class print “mt1” (100 times) followed by “mt2” (100 times), mt1.sleep(100); can be placed at //XXX position.

D.In order to make the MyThread class print “mt1” (100 times) followed by “mt2” (100 times), mt1.run(); can be placed at //XXX position.

E. In order to make the MyThread class print “mt1” (100 times) followed by “mt2” (100 times), there is no need to write any code.

quais estão certas?

Opção A?

Opção A !!!

InterruptedException() é exibido apenas quando quando uma thread está esperando, dormindo, pausada por muito tempo e uma outra thread interrompe-a.

A! Essa InterruptedException taí de bobeira!

pessoal, esta resposta é o óbvio :slight_smile:

tem mais uma correta, e o conceito é muito importante… qual é?

B
join() faz esperar a thread terminar.

ok, a B está correta, mas por mais obvia que seja eu naum entendi por a A está correta?

try &#123;
    MyThread mt1 = new MyThread&#40;&quot;mt1&quot;&#41;;
    MyThread mt2 = new MyThread&#40;&quot;mt2&quot;&#41;;
    mt1.start&#40;&#41;;
    // XXX
    mt2.start&#40;&#41;;
&#125; catch&#40;InterruptedException ex&#41; &#123;

&#125; 

Não existe a possiblidade do código dentro do TRY lançar a exceção InterruptedException, sendo assim o código não compilará.

A resposta “a” está correta se não colocar nada em ///XXX.
Segue a explicação do colega dgouvea:

[quote=“dgouvea”][code]
try {
MyThread mt1 = new MyThread(“mt1”);
MyThread mt2 = new MyThread(“mt2”);
mt1.start();
// XXX
mt2.start();
} catch(InterruptedException ex) {

}
[/code]

Não existe a possiblidade do código dentro do TRY lançar a exceção InterruptedException, sendo assim o código não compilará.[/quote]

Desculpe mas contiuo sem entender…
Sou muito leigo nesse assunto

InterruptedException é uma exceção verificada… quando as exceções são verificadas, e no caso do catch, que está colocando-a como que possivelmente será lançada, dentro do bloco de código try é obrigatório que exista algum código em que seja possível de lançar esta exceção, como Thread.sleep() por exemplo…

mas no caso do exemplo, o código que está no try é impossível de lançar esta exceção InterruptedException porque o construtor de thread e o metodo start() não lançam a exceção InterruptedException na sua declaração.

outro exemplo pra vc se situar é:

try {
     String s = "oi ";
     s+= "mundo";			
} catch(IOException e) {
     System.out.println("Erro: "+e);
}

neste exemplo, como que manipulação de Strings geraria erro de IOException? Impossível… por isso que gera erro de compilação, porque IOException NUNCA poderia capturar erros em operações de Strings.

Já o exemplo abaixo está correto:

try {
     String s = "oi ";
     s+= "mundo";			
} catch(RuntimeException e) {
     System.out.println("Erro: "+e);
}

porque RuntimeException e suas classes filhas não são checadas, portanto pode colocar mesmo que nunca seria capturada.

se tivesse somente uma opção eu marcaria a letra B. Não marcaria a letra A.
Assim la no exame vc nao encontrar… perguntas que tem duas respostas corretas e ele pede para marcar uma… isso é algo que nao acontece…
Agora é interessante saber pq as outras estão eerradas… eu qdo to fazendo simulado marco a certa e descobro pq as outras estao erradas… pq a C,D,E não pode ser verdadeiro?

Assim aprende mais… eu tive dificuldade de responder ai… devido o meu ingles… mais no whizlabs nao tenho dificuldade isso é uma questao do simulado da kathy ne? o ingles nao muito claro como no whizlabs… alias pelo menos eu acho…

eu ficari com a b somente

É a A e a B. Ele fala na “A” que na “condição atual” o código não compila. E isso está certo.

Mas ele compilará se você colocar qualquer alternativa por lá seja o join(), sleep(), wait(), pois todas lançam a InterruptedException.
Por mim, isso gera mais ambiguidade na questão do que benefício. Mas os avaliadores são mesmo sacanas.

O join faz com que uma thread espere o termino de outra. Nesse caso, quando mt1.join() é chamado pela thread do main, a thread do main dorme e só acorda quanto mt1 termina. Isso garante que a linha mt2.start() só irá ser executada depois do nome de mt1 ser impresso 100 vezes.

Seguindo a sugestão do Camilo:

Correto. Na condição atual, esse código não compila por causa do catch na InterruptedException, que não será lançada pelo start();

Correto. Como expliquei ali em cima, isso faz a thread do main esperar mt1 terminar. E só então mt2.start() será chamado.

Falso. Sleep 100 fará a thread do main esperar 100 milisegundos. Isso pode ser mais rápido que imprimir 100 vezes, mas também pode ser mais lento. Se for mais lento, algumas vezes mt1 aparecerá alternado com mt2. Como é uma solução que só funciona “de vez enquando”, nada pode ser afirmado.

Se fossemos substituir o start() por run() estaria certo. Pois mt1.run() estaria rodando na thread do main, e não em uma nova thread. Mas, colocando no lugar do XXX, obteremos mais de 100 vezes a impressão de mt1, seguida pela impressão de mt2 com alguns elementos possivelmente alternados com mt1 também.

Falso. Não há qualquer garantia da ordem de execução de duas threads.

Resposta B