Dúvida Thread - TestKiller

6 respostas
diegobrandao

Bom dia todos,

Estou com mais uma dúvida sobre Threads…

public class TwoThreads2 {

	private static Object resource = new Object();

	private static void delay(long n) {
		try {
			Thread.sleep(n);
		} catch (Exception e) {
			System.out.print("Error ");
		}
	}

	public static void main(String[] args) {
		System.out.print("StartMain ");
		new Thread1().start();
		delay(1000);
		Thread t2 = new Thread2();
		t2.start();
		delay(1000);
		t2.interrupt();
		delay(1000);
		System.out.print("EndMain ");
	}

	static class Thread1 extends Thread {
		public void run() {
			synchronized (resource) {
				System.out.print("Startl ");
				delay(6000);
				System.out.print("End1 ");
			}
		}
	}

	static class Thread2 extends Thread {
		public void run() {
			synchronized (resource) {
				System.out.print("Start2 ");
				delay(2000);
				System.out.print("End2 ");
			}
		}
	}
}
/*
Assume that sleep(n) executes in exactly m milliseconds, and all other
code executes in an insignificant amount of time. What is the output if
the main() method is run?
A. Compilation fails.
B. Deadlock occurs.
C. StartMain Start1 Error EndMain End1
D. StartMain Start1 EndMain End1 Start2 End2
E. StartMain Start1 Error Start2 EndMain End2 End1
F. StartMain Start1 Start2 Error End2 EndMain End1
G. StartMain Start1 EndMain End1 Start2 Error End2

*/

A resposta é a letra G. Porque não pode ser tbm a letra a F???

Executei o código e realmente deu isso… agora a minha dúvida é, se isso sempre vai acontecer? Não há outra possibilidade?
Outra dúvida é a respeito do método t2.interrupt(), no livro K&B é dito que o mesmo não cai… Afinal ele cai ou não?

Desde já agradeço


Diego

6 Respostas

peerless

Você não está confundindo interrupt com suspend ?

diegobrandao

Bom. Acho que não.
O que eu entendo do interrupt() é que ele manda a thread “se matar”… É isso mesmo?
O interrupt() cai na prova?
Essa é a questão 123 do TestKiller

peerless

a questão pelo que lembro no livro da khaty, eh que os métodos que não caem referentes a isso é: suspend e stop…

[]s

ViniGodoy

O interrupt() só manda um sinal para thread. Com esse sinal, os métodos sleep e wait() lançam uma interrupted exception e o método Thread.isInterrupted() passa a retornar true. Não tem como matar forçosamente uma thread.
A thread só irá parar com o interrupt se o programador teve o cuidado de parar a thread nessas condições.

Agora, você está certo quanto a ordem de execução. Não existem garantias de que ordem esses métodos irão rodar, embora seja muito provável que rodem na ordem da resposta do exercício. Entretanto, se vc tiver uma VM num sistema não preemptivo, essa VM tem o direito de rodar uma thread por vez. A saída seria, portanto:
StartMain EndMain Start1 End1 Start2 Error End2

Agora, num sistema típico (em especial aqueles onde a VM roda) aquela diferença nos timers garante que a saída seja a letra G. Faça um diagrama de sequência levando em consideração os tempos que vc facilmente enxergará isso.

luistiagos

cara na minha prova cai exatamente esta questão q por sinal eu acabei errando… o que mais errei foi threads e é o que e mais foda… então pau nas threads…

diegobrandao

Valew gente… estou tentando… mais ta complicado… rsrs

Criado 12 de setembro de 2008
Ultima resposta 16 de set. de 2008
Respostas 6
Participantes 4