Dúvida questão prioridade entre Threads

8 respostas
Gustavo_Santos

Direto do livro da Keity:

public static void main(String[] args) {
		Thread t = new Thread();
		t.start();
	}

" O thread referênciado por t terá a mesma prioridade do thread main(), já que esse está executando o código que cria a instância de t; "

Se as prioridades forem iguais, a implementação do agendador fará uma das duas coisas:

  • Selecionar a execução de um thread mantendo-o assim até que seja bloqueado ou conclua seu método run();
  • Dividir o tempo dos threads do pool para dar a todos uma oportunidade igual de execução.

Testando eu obtive as saídas:
0, 2, 4, 6, 0, 2, 4, 6, ok, entendi com base no que ela disse.
0, 2, 4, 6, 8, 10, 12, 14, idem !

Porém a questão do testKiller diz que as saídas possível são :
A. 0, 2, 4, 4, 6, 8, 10, 6, NÃO ENTENDI ESSA SAÍDA AQUI !!!
C. 0, 2, 4, 6, 8, 10, 12, 14,

public class Thread1 {
	int x = 0;
	
	public class Runner implements Runnable {
		public void run() {
			int current = 0;
			for(int i = 0; i < 4; i++) {
				current = x;
				System.out.print(current + ", ");
				x = current + 2;
			}
		}
	}
	
	public void go() {
		Runnable r = new Runner();
		new Thread(r).start();
		new Thread(r).start();
	}
	
	public static void main(String[] args) {
		new Thread1().go();

	}

}

Outra coisa, cada Thread1 irá executar uma cópia do método run() de Runner ? ou executarão o mesmo ?
Em outras palavras, cada Thread1 possui cópias das variáveis locais do run de Runner ?
Cada objeto possui seu proprio valor x ? Ou dividem o mesmo ?! Pelo que entendi, eles dividem !!!

Grato a quem ajuda !!!

8 Respostas

romarcio

Cada chamada new Thread®.start() ira executar um loop 4 vezes.

Então na 1ª vc poderia ter 0,2,4,6
Na 2ª chamada 8,10,12,14

Como não tem sincronização, vai depender muito do agendador.

Nesse caso: 0, 2, 4, 4, 6, 8, 10, 6 veja que a 1ª thred executou 0,2,4 dai o agendador passou para a 2ª e executou 4,6,8,10 e depois voltou para a execução da 1ª 6 que era o valor que faltava na 1ª execução.

Uma maneira legal para entender é nomeando as Thread’s.

pode fazer assim:

public void go() {
		Runnable r = new Runner();
		//new Thread(r).start();
		//new Thread(r).start();
        
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        t1.setName("t1");
        t2.setName("t2");
        t1.start();
        t2.start();
	}

	public class Runner implements Runnable {
		public void run() {
			int current = 0;
			for(int i = 0; i &lt; 4; i++) {
				current = x;
				System.out.print("thread: " + Thread.currentThread().getName() + " " + current + ", ");
				x = current + 2;
			}
		}
	}
D

Se, me permitem dar minha opniao, mas ja dando, eu acho que esta opçao do TestKiller esta errada: 0, 2, 4, 4, 6, 8, 10, 6

Os dois Threads executam o mesmo método run() pois eles usam o mesmo objeto Runner. Se o segundo thread executa o método e faz com que a variavel current receba 6, não tem como o primeiro Thread voltar e exibir 6.

romarcio

Dota:
Se, me permitem dar minha opniao, mas ja dando, eu acho que esta opçao do TestKiller esta errada: 0, 2, 4, 4, 6, 8, 10, 6

Os dois Threads executam o mesmo método run() pois eles usam o mesmo objeto Runner. Se o segundo thread executa o método e faz com que a variavel current receba 6, não tem como o primeiro Thread voltar e exibir 6.

Pode sim.

Acontece quando por exemplo, a Thread 1 recebe o valor 6, mas seu tempo de execução acaba para execução da Thread 2, dai quando acabar o tempo de execeução da Thread 2, a Thread 1 volta a ser executada da onde parou, no caso teria recebido o 6, mas ainda não tinha impresso o valor, então ele imprime o 6.

D

romarcio:
Dota:
Se, me permitem dar minha opniao, mas ja dando, eu acho que esta opçao do TestKiller esta errada: 0, 2, 4, 4, 6, 8, 10, 6

Os dois Threads executam o mesmo método run() pois eles usam o mesmo objeto Runner. Se o segundo thread executa o método e faz com que a variavel current receba 6, não tem como o primeiro Thread voltar e exibir 6.

Pode sim.

Acontece quando por exemplo, a Thread 1 recebe o valor 6, mas seu tempo de execução acaba para execução da Thread 2, dai quando acabar o tempo de execeução da Thread 2, a Thread 1 volta a ser executada da onde parou, no caso teria recebido o 6, mas ainda não tinha impresso o valor, então ele imprime o 6.

Mas se for seguir esse raciocinio veja so:

current = x; System.out.print("thread: " + Thread.currentThread().getName() + " " + current + ", "); x = current + 2;

Thread 1: 0
Thread 1: 2
Thread 1: 4
Thread 1: soma current + 2, mas nao imprime. ok?!

Se a Thread 2, imprime 4, logo ela começou a ser executada juntamente com a Thread 1 em sua execução. Depois que Thread 1 soma 4+2 mas não á imprime como voce disse, a Thread 2 também vai somar e sua soma será 6+2. Então não tem como a Thread 2 imprimir 6 igual está no resultado.

romarcio

Dota, veja uma coisa:

Thread 1: 0
Thread 1: 2
Thread 1: 4
Thread 1: soma current + 2, mas nao imprime. ok?!

current = x;   
System.out.print("thread: " + Thread.currentThread().getName() + " " + current + ", ");   
x = current + 2;

Quando ele imprimiu o 4 dai recebeu + 2 e passou a valer 6.
Então s interrupção pode acontecer após a atribuição na linha 1(quando current recebe o valor 6 de x). E a linha 2 não seria executada naquele momento, só após que a thread 2 liberasse.
Então ele imprime o 6, e então soma + 2 e teria 8, mas dai a thread 1 já teria feito as 4 passagens pelo for e não imprimiria o 8.

D

Ops vc ta com a razao, e obrigado pela paciencia de me mostrar rsrs.

romarcio

Rodei esse exemplo e tive essa saída: [color=green]t1 0,[/color][color=blue] t2 0, t2 2, t2 4, t2 6, [/color][color=green]t1 2, t1 4, t1 6[/color]

E ai? Complicado não acha? Mas acontece.

Faça alguns testes com esse exemplo, vai ver que tem varias possibilidades, a mais comum no meu caso foi essa: t1 0, t1 2, t1 4, t1 6, t2 8, t2 10, t2 12, t2 14

romarcio

Que isso, capaz, não mexo muito com Thread, mas sempre é válida as discuções.

Criado 8 de setembro de 2010
Ultima resposta 8 de set. de 2010
Respostas 8
Participantes 3