for(int i = 0; i < 10; i++) {
p.print("PrinterTest "+ String.valueOf(i));
}//for
p.stop();[/code]
O problema é que entre o start e o stop não existe nenhuma garantia que a thread terá a chance de entrar em execução. Ou seja, você dá o p.start(), seta o valor a ser impresso diversas vezes, dá p.stop() e o seu loop principal da classe PrinterThread pode não ter nem mesmo iniciado. Ou no seu caso, ele entrou depois que value tinha sido setado para 9.
Vale lembrar que isso não é defeito, a JVM e/ou sistema operacional decidem ao gosto deles o tempo que cada thread permanecerá em execução antes de dar a chance para outra.
Mas existem formas de resolver, pode tentar descobrir se quiser… precisando de ajuda estamos aí
No caso apenas para quem sabe poder dar uma enriquecida, tanto o windows quanto a jvm tratam o escalonamento de processos de forma preemptiva (utilizando politicas de escalonamento para controlar o fluxo de execução), ou seja eles interferem no processamento dos processos, adotando uma regra para execução de cada processo.
Descobri como garantir a execução de PrinterThread, tudo bem que a performance fica meio prejudicada, mas funciona. Acho que nesse caso é mais uma gambiarra do que uma solução.
Eu adicionei Thread.yield() no for.
public static void main(String[] args) {
PrinterThread p = new PrinterThread();
p.start();
for(int i = 0; i < 10; i++) {
p.print("PrinterTest "+ String.valueOf(i));
//"gambi"
Thread.yield();
}//for
p.stop();
}//method()
Descobri como garantir a execução de PrinterThread, tudo bem que a performance fica meio prejudicada, mas funciona. Acho que nesse caso é mais uma gambiarra do que uma solução.
Eu adicionei Thread.yield() no for.
[/quote]
Acredito que uma solução mais “elegante” seria usar uma fila para armazenar e imprimir os valores dentro da thread PrintThread, assim como remover a “espera ocupada” (busy waiting) do método run(). Segue o código-fonte em anexo.