Dúvida sobre threads.[Esclarecido]

4 respostas
antonioedirane

Estou com dúvida na seguinte questão de threads.
A pergunta é a seguinte:
Given:

public class Starter extends Thread {
	private int x = 2;

	public static void main(String[] args) throws Exception {
		new Starter().makeItSo();

	}

	public Starter() {
		x = 5;
		start();
	}

	public void makeItSo() throws Exception {
		join();
		x = x - 1;
		System.out.println("x = " + x);
	}

	public void run() {
		x *= 2;

	}
}


What is the output if the main() method is run?
A. 4
A. 4
B. 5
C. 8
D. 9
E. Compilation fails.
F. An exception is thrown at runtime.
G. It is impossible to determine for certain.

E a resposta que está certa segundo o mock é a D.

Eu não entendi direito esse start() e esse join() não deveria ser assim por exemplo. t.start e t.join().
Mesmo sem a referencia ele cria a thread. Normal isso ?
Testei no Eclipse e ele cria a Thread-0.
Pra chegar no valor 9 ele teria que seguir os seguintes passos.

  1. A variável x começa valendo 2
  2. newStarter() - Ao passar pelo contrutor passa a valer 5
  3. No próprio construtor é iniciada a nova thread
  4. Como iniciou a nova thread o código run é executado ( x*=2 => x=5*2 => 10 )
  5. join() - Junto a thread main no final da "Thread-0". Enquanto a "Thread-0" não terminar, o main fica aguardando.
  6. Quando a "Thread-0" termina x= x-1 que é igual a 9.

É isto que acontece ?

4 Respostas

Felagund

sim. É exatamente isso :slight_smile:

ricardo13

olá,

Exatamente isso.

Imagine que quando deu start() criou 2 threads (main e start) executando no processador.
Quando deu start() vc executa 1º o método run() (x fica valendo 10)…depois executa o método makeItSo() que tem o método join().
O join() faz com que a thread que corresponde a execução do Main fica esperando a thread lançada pelo Start().
Ao final, as duas threads terminam “praticamente” juntas.

Espero ter ajudado

Ricardo

antonioedirane

Valeu Pessoal.
Este fórum esta me ajudando muito no meu estudo para o SCJP6.
Espero daqui a pouco tempo, estar escrevendo o eu post “SCJP6 - Passei”.
hehehe.

R

Olá!

Prezados, fiz um programa com threads, mas o obetivo é fazer ele "erroneamente".

Estou fazendo 20 usuários depositarem em uma conta bancária R$ 1.000 porém o saldo não pode chegar a R$ 20.000.

Eu programei da seguinte maneira.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using SystemThreading;
namespace Program

{

class Program

{

static int val = 0;
static void saldo ()
             {

                     for (int i = 0; i < 1000; i++)
                     {

                          val += 1;
                          
                          Console.WriteLine("Thread: " + val);
                      }
              }

              static void Main (String [] args)
              {
               for (int i = 0; i < 20; i++)
              {
                    Thread t = new Thread(saldo);
                    t.Start();
               }

               Console.WriteLine("\nSeu saldo é: " + val);
               Console.ReadKey();
        }

    }

}

Alguém poderia me ajudar? Preciso que esta implementação não chegue a 20.000 o saldo total, teria que chegar por exemplo à: 19.998.

Grato a todos!

Rafael Vargas

Criado 15 de maio de 2009
Ultima resposta 16 de out. de 2010
Respostas 4
Participantes 4