Ola Pessoal!
Como eu posso mudar(controlar) a priiridade das minhas Threads?
Desde já agradeço
Ola Pessoal!
Como eu posso mudar(controlar) a priiridade das minhas Threads?
Desde já agradeço
nomedaThread.setPriority(x);
sendo x um valor de 1 a 10.
Ola daniels, valeu pela ajuda, mas tenho o seguite código:
public static void main(String[] args) throws IOException, InterruptedException
{
ProgramaThread p = new ProgramaThread();
p.setId(1);
Thread t = new Thread(p);
Informacao ppp = new Informacao();
p.setId(2);
Thread tt = new Thread(ppp);
tt.setPriority(1);
t.setPriority(2);
t.start();
tt.start();
}
só que a prioridade não esta valendo, pois ainda as Threads estão aleatórias
como faço para executar primeiro tt.start() e depois t.start()?
Desde já agradeço
Eu nunca mudei prioridade das Threads… Li muito pouco sobre Threads na verdade. Mas use o método sleep para forçar a execução de outra Thread.
public static void main(String[] args) throws Exception
{
ProgramaThread p = new ProgramaThread();
p.setId(1);
Thread t = new Thread(p);
Informacao ppp = new Informacao();
p.setId(2);
Thread tt = new Thread(ppp);
t.start();
t.sleep(100);
tt.start();
tt.sleep(100);
}
Como já disse, li pouco sobre isso e faz um tempo. Então não sei se está certo. Mas deve funcionar.
Outra coisa: eu mudei o throws ali para Excpetion, pois já que é a main, não há ninguém para tratar a exceção.
Repita comigo: Eu não posso controlar a ordem do escalonador.
A prioridade só diz ao escalanador que vc precisa que a thread A rode mais ou menos que a B, mas não diz quando. E ele também não é obrigado a obedece-lo…
É uma péssima pratica tentar controlar o fluxo, especialmente mexendo nas prioridades. Aliás, a recomendaçao geral é que não se altere as prioridades das threads, pois nem todos os SOs podem garantir ausência de starvation (isto é, que threads de prioridades muito baixas, vão executar com certeza).
O máximo que uma thread pode fazer é se colocar para dormir (através de sleep ou wait) ou indicar que seria um bom momento para a preempção com yield(). Entretanto, a decisão final de trocar ou não de thread permanece com o escalonador, assim como a decisão de qual deve ser a próxima thread a processar.
Você só deve controlar a execução de threads em blocos onde há memória compartilhada. Isto é, quando duas threads percorrerem o mesmo objeto. Aí sim, você coloca os blocos sincronized, e impede que duas threads acessem o código ao mesmo tempo. Ainda assim, você não garante qual thread irá rodar aquele código por primeiro.
Se você precisa que uma thread comece antes da outra, faça a primeira thread iniciar a segunda. Simples, não?
E o código que eu postei não funciona. O sleep é dentro da Thread e não na main.
class Execucao1 implements Runnable {
private Thread segunda;
public Execucao1(Thread segunda) {
this.segunda = segunda;
}
public void run () {
System.out.println ("thread 1");
segunda.start();
}
}
class Execucao2 implements Runnable {
public Execucao2() {
}
public void run () {
System.out.println ("thread 2");
}
}
class ThreadBemComportada {
public static void main(String[] args) throws Exception {
Thread thr2 = new Thread (new Execucao2());
Thread thr1 = new Thread (new Execucao1 (thr2));
System.out.println ("Iniciando a thread 1...");
thr1.start();
System.out.println ("Esperando a thread 1 voltar...");
thr1.join();
System.out.println ("Esperando a thread 2 voltar...");
thr2.join();
System.out.println ("Fim.");
}
}