1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Exercício de Thread

Galera, estou fazendo alguns exercícos e fiquei com um pouco de dúvidas sobre esse de Thread:

  • Dado o código abaixo, quais são os possiveis resultados?
public class Cruiser {
    private int a = 0;

    public void foo() {
        Runnable r = new LittleCruiser();
        new Thread(r).start();
        new Thread(r).start();
    }

    public static void main(String arg[]) {
        Cruiser c = new Cruiser();
        c.foo();
    }

    public class LittleCruiser implements Runnable {
        public void run() {
            int current = 0;
            for (int i = 0; i < 4; i++) {
                current = a;
                System.out.print(current + ", ");
                a = current + 2;
            }
        }
    }
}
  • A) 0, 2, 4, 0, 2, 4, 6, 6,
  • B) 0, 2, 4, 6, 8, 10, 12, 14,
  • C) 0, 2, 4, 6, 8, 10, 2, 4,
  • D) 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14,
  • E) 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,

Respostas corretas:

A) 0, 2, 4, 0, 2, 4, 6, 6,

B) 0, 2, 4, 6, 8, 10, 12, 14,

Até então, eu pensava que quando chamamos os métodos start de duas Thread's distintas e não usamos metodos sincronizados, seu comportamento não poderia ser previsto. Se puderem dar uma explicada de uma forma mais direta fico agradecido (estou buscando conteúdo, mas mesmo lendo não consegui entender muito bem).

  • Desculpe ressucitar o post, é que como fiquei estudando surgiu mais uma dúvida. Seria possível qualquer sequência paralela das thread's? Mais ou menos como na alternativa a, só que a sequencias aleatórias não repetidas como por exemplo: 0,0,2,2,4,4,6,6 ? Até que ponto podemos saber se o resultado de uma vai ou não influenciar na outra thread (não sei se consegui me explicar muito bem)

    Paulo Castro   03 de nov de 2014
  • Paulo, se vc percebeu o problema, ambas as threads acessam um atributo privado da classe Cruiser diretamente, o atributo a. para que fosse impresso algo como 0,0,2,2,4,4 seria necessario que a linha 'a = current + 2' fosse executado muito proximas umas das outras, afim de guardar o valor de current 'antigo'. sem o uso de um bloco syncronized nós não podemos garantir que o acesso a variavel a será sincronizado portanto isso poderia acontecer eventualmente, porém a ponto de gerar 0,0,2,2,4,4,6,6 me parece muito dificil. sem falar que entre elas vc tem uma operação de I/O que toma tempo.

    peczenyj   03 de nov de 2014
  • Como as duas threads rodam sobre o mesmo Runnable, e eles tem uma variável "global", chamada "a", uma thread certamente irá influenciar na outra. A variável "a" é a região crítica, e é ela que vai complicar a análise. Como as threads podem rodar em qualquer ordem possível, você só poderia saber quais são as saídas possíveis se testasse as inúmeras combinações para encontrar padrões. É claro que isso é muito caótico, por isso, esse código representa um erro grosseiro de programação.

    ViniGodoy   03 de nov de 2014
  • Esse código foi tirado de um mock para certificação, então acho que os erros grosseiros foram "de propósito", de qualquer forma acho que agora consegui compreender. Obrigado novamente!!

    Paulo Castro   04 de nov de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags threads certificação java ou faça a sua própria pergunta.