Rocklee6544:
E no livro ele fala para considerara uma thread como um objeto qualquer em java e classe que implementa Runnable uma tarefa
a ser executada.
Falou besteira. Thread não é um objeto.
Thread é uma linha de execução, é o que você chamou de "segmento". Aliás, segmento é a tradução literal da palavra thread.
Os objetos da classe Thread fazem duas coisas:
a) Criam uma nova thread (no método start);
b) Informam o estado da thread criada.
Note porém que o objeto da classe Thread não é a thread criada. Ele só a representa.
Da mesma forma, um objeto da classe File não é o arquivo, é só um representante do arquivo.
Aqui diz que thread é um executor esperando uma tarefa (algo executável ser passado para ele)
e quando isso é feito nós damos o comando thread.start(tarefa).
Um objeto da classe Thread é um executor. A thread é o que esse executor gera.
Isso cria um segmento.
Então por exemplo em uma aplicação
que use uma thread temos dois segmentos
O tradutor do livro usou a palavra "segmento" para traduzir a palavra thread. Talvez, no intuito de causar menos confusão num tema onde os termos são tão parecidos. Porém, ele usou um termo infeliz. Primeiro, porque nenhum livro de SO usa o termo "segmento" para se referir a threads. Você as vezes lê o termo "subprocesso" (que também é errado) e as vezes lê o termo "linha de execução", mas segmento é novo para mim. Sempre me irritei com livros traduzidos justamente por não terem uniformidade na tradução. "Segmento" em SO refere-se a outras coisas.
Mas que fique claro o seguinte. Todo programa inicia com a "main thread", a thread principal. Se tem um programa rodando, tem uma thread. Os objetos da classe thread podem então disparar novas threads, como você mesmo mencionou.
Nesse livro que lí ao invés de monitor (schedule) é chamado de agendador, mas creio que o termo mais técnico seria escalonador .(imprevisível como tal).
Cuidado. Em threads monitor e escalonador são coisas complementamente diferentes.
Escalonador é o software do SO que é coloca os processos e suas threads para rodar.
Monitor é o nome da variável que controla onde os waits e notifys são dados.
Entendo que ao se falar em thread lidamos com três coisas diferentes o Objeto thread, o segmento em execução criado pela thread e a tarefa a ser executada.
Exatamente. O objeto thread, a thread em execução, e o código onde essa thread está rodando (a tarefa a ser executada).
É importantíssimo entender que uma thread não é um objeto, pois um objeto pode ser percorrido por duas threads simultaneamente. E é aí que surgem os problemas de sincronização.
Você pode disparar duas threads sobre o mesmo runnable, ou pode fazer com que uma thread que começou em um runnable passe para outro, simplesmente chamando um de seus métodos.
Tanto wait,notify,sleep() servem para comunicação entre threads.
se colocado um wait dentro de uma thread x para uma y
ela(thread) será obrigado a esperar a execução da do segmento da thread y para voltar a sua execução.
Ok acho que funciona assim mesmo e depois disso a mesma irá voltar a sua execução normal.
( thread y tem que avisar as threads que dependem dela através do notifyAll.
Aqui vem a dúida a thread A dormi e espera ser acordada pela thread y.
Se ela dormi com wait para que serve o comando sleep()?
:oops:
O comando sleep serve para a thread pedir para dormir por conta própria, por alguns milissegundos, sem esperar outra thread acorda-la.
Quando uma thread se põe para dormir, outras podem usar o processador.
Um exemplo clássico do uso de sleep é no loop de um jogo.
Queremos rodar um jogo geralmente a 60 quadros por segundo (é o tempo que o monitor pisca).
Portanto, o tempo de um quadro deve ser 1000 / 60 milissegundos.
Entretanto, pode ser que o computador seja mais rápido que isso, por isso, fazemos o loop de jogos assim:
long tempoEm60FPS = 1000 / 60; //Tempo que queremos para um quadro
while (oGameEstaRodando) {
long antes = System.currentTimeMillis();
processaLogica();
desenha();
//Calculamos o tempo que levou para processar e desenhar
long tempo = System.currentTimeMillis() - antes;
//Se o computador for mais rápido
if (tempo < tempoEm60FPS) {
//Esperamos o que falta para dar os 60 FPS
Thread.sleep(tempoEm60FPS - tempo);
}
}
Isso impede que um computador daqui a 5 anos faça o jogo rodar como se você tivesse pressionado o botão de "avançar" do seu aparelho de DVD (um problema que ocorria com jogos antigos).
E também garante que máquinas diferentes rodem o jogo à mesma velocidade, mesmo que seus processadores sejam diferentes (desde que elas consigam a taxa mínima, lógico).