Analise o código Java apresentado a seguir. public class Main extends Thread { public static void main(String[] args) { Main thread = new Main(); thread.start(); for (int k=1; k<=5; k++) { System.out.println("A" + k); try { Thread.sleep(1100); } catch (InterruptedException ex) {} } } public void run() { for (int k=1; k<=5; k++) { try { Thread.sleep(700);} catch (InterruptedException ex) {} System.out.println("B" + k); } } } Quando esse código é executado num computador com boa capacidade e sem interferência de processos externos, os valores exibidos, na ordem, são:
- A)A1 A2 A3 A4 A5 B1 B2 B3 B4 B5
Errada, porque ela ignora a interlevação entre as threads e supõe que a thread principal conclui tudo antes da outra.
- B)A1 B1 A2 B2 A3 B3 A4 B4 A5 B5
Errada, porque alterna perfeitamente A e B, mas os tempos de sleep diferentes nao produzem essa simetria.
- C)A1 B1 A2 B2 B3 A3 B4 A4 B5 A5
Certa, pois os tempos de 700 ms e 1100 ms fazem as saídas se intercalarem exatamente nessa ordem.
- D)B1 A1 B2 A2 B3 A3 B4 A4 B5 A5
Errada, porque colocaria a thread secundaria sempre à frente no início, mas a principal imprime A1 imediatamente.
- E)B1 B2 B3 B4 B5 A1 A2 A3 A4 A5
Errada, porque trata a execução como se uma thread terminasse toda antes da outra, o que nao ocorre aqui.
Gabarito: C
Aqui a ideia é simples: o programa cria uma nova thread com start(), e isso faz o método run() rodar em paralelo com o fluxo principal. Enquanto a thread secundaria dorme 700 ms antes de cada B, a thread principal imprime A e dorme 1100 ms antes de seguir para o próximo número. Ou seja, as duas linhas de execução competem, mas quem dorme menos tende a aparecer antes com mais frequência. O ponto principal é que start() nao executa run() como uma chamada comum de método. Ele cria concorrência de verdade, entao os impressos podem se intercalar. Como o enunciado fala em computador com boa capacidade e sem interferências externas, a sequência esperada fica determinada pelos tempos de pausa de cada thread. Na prática, a principal imprime A1 primeiro, logo no início. Depois a thread do run() acorda antes, imprime B1, e assim por diante. Como 700 ms é menor que 1100 ms, a série B costuma adiantar alguns passos, até ocorrer aquele pequeno cruzamento em que B3 aparece antes de A3. Por isso o gabarito é a alternativa C: A1, B1, A2, B2, B3, A3, B4, A4, B5, A5. Em questões de Java com threads, a banca adora testar se voce sabe diferenciar start() de run() e entender que sleep() só pausa a thread atual, nao o programa inteiro.