← Questões de Programação

Programação · FGV · 2023

Questão comentada de Programação

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:

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.

Continue treinando

Questões relacionadas