Digamos que temos esses dois Runnables:
class R1 implements Runnable {
public void run() { … }
…
}
class R2 implements Runnable {
public void run() { … }
…
}
Então qual é a diferença entre isso:
public static void main() {
R1 r1 = new R1();
R2 r2 = new R2();
r1.run();
r2.run();
}
E isto:
public static void main() {
R1 r1 = new R1();
R2 r2 = new R2();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
java
multithreading
concurrency
runnable
Ori Popowski
fonte
fonte
start()
, que está chamando um método natvie, que deve estar fazendo com que as coisas relacionadas ao thread do sistema aconteçam.start()
A fonte do método está aqui .Se você simplesmente chamar
run()
diretamente, ele será executado no segmento de chamada, como qualquer outra chamada de método.Thread.start()
é necessário para realmente criar um novo encadeamento para que orun
método do executável seja executado em paralelo.fonte
Thread.start()
chamada faz com que o estado do encadeamento se mova do novo estado para o estado Runnable . Runnable não significa que o thread esteja em execução. Depois que o encadeamento nativo foi inicializado, o encadeamento nativo invoca orun()
método no encadeamento Java, que altera o estado do encadeamento de Runnable para Running . Quando o encadeamento termina, todos os recursos para o encadeamento nativo e Java são liberados.A diferença é que
Thread.start()
inicia um thread que chama orun()
método, enquantoRunnable.run()
apenas chama orun()
método no thread atual.fonte
A diferença é que, quando o programa chama o
start()
método, um novo thread é criado e o código internorun()
é executado no novo thread; se você chamar orun()
método diretamente, nenhum novo thread será criado e o código internorun()
será executado diretamente no thread atual.Outra diferença entre
start()
erun()
no encadeamento Java é que você não pode chamarstart()
duas vezes. Uma vez iniciada, a segundastart()
chamada será lançadaIllegalStateException
em Java enquanto você pode chamar orun()
método várias vezes, pois é apenas um método comum .fonte
Na verdade,
Thread.start()
cria um novo encadeamento e tem seu próprio cenário de execução.Thread.start()
chama orun()
método de forma assíncrona, que altera o estado do novo Thread para Runnable.Mas
Thread.run()
não cria nenhum novo thread. Em vez disso, execute o método run no atual thread em execução de forma síncrona.Se você estiver usando
Thread.run()
, não estará usando os recursos do multi threading.fonte
invoke
run()
está sendo executado no thread de chamada, como qualquer outra chamada de método. ao passo queThread.start()
cria um novo thread. invocarrun()
é um erro programático.fonte
Se você fizer isso
run()
no método principal, o encadeamento do método principal chamará orun
método em vez do encadeamento que você precisa executar.O
start()
método cria um novo encadeamento e para o qual orun()
método deve ser feitofonte
main
escritor significava o método de chamada. Sua resposta é muito boa. 1 ;-)t.start()
é o método que a biblioteca fornece para o seu código chamar quando você deseja um novo thread.r.run()
é o método que você fornece para a biblioteca chamar no novo encadeamento.A maioria dessas respostas perde a visão geral, que é a de que, no que diz respeito à linguagem Java, não há mais diferença entre
t.start()
e dor.run()
que há entre outros dois métodos.Ambos são apenas métodos. Ambos correm no segmento que os chamou . Ambos fazem o que foram codificados para fazer e, em seguida, retornam, ainda no mesmo segmento, aos seus interlocutores.
A maior diferença é que a maior parte do código para
t.start()
é código nativo , enquanto, na maioria dos casos, o código parar.run()
será Java puro. Mas isso não faz muita diferença. Código é código. O código nativo é mais difícil de encontrar e mais difícil de entender quando você o encontra, mas ainda é apenas o código que informa ao computador o que fazer.Então o que
t.start()
faz?Ele cria um novo encadeamento nativo, organiza a chamada desse encadeamento
t.run()
e, em seguida, diz ao sistema operacional para permitir que o novo encadeamento seja executado. Então ele retorna.E o que
r.run()
faz?O engraçado é que a pessoa que faz essa pergunta é a pessoa que a escreveu .
r.run()
faz o que você (ou seja, o desenvolvedor que o escreveu) o projetou para fazer.fonte
Thread.start()
O código registra o Thread com o planejador e o planejador chama orun()
método Além disso,Thread
é class enquantoRunnable
é uma interface.fonte
Os pontos que os membros fizeram estão bem, então eu só quero acrescentar algo. O problema é que o JAVA não suporta herança múltipla. Mas o que é se você deseja derivar uma classe B de outra classe A, mas você só pode derivar de uma classe. O problema agora é como "derivar" de ambas as classes: A e Thread. Portanto, você pode usar a interface executável.
fonte
Se você chamar o
run()
método diretamente , não estará usando o recurso de multiencadeamento, pois orun()
método é executado como parte do encadeamento do chamador.Se você chamar o
start()
método no Thread, a Java Virtual Machine chamará o método run () e dois threads serão executados simultaneamente - Thread Atual (main()
no seu exemplo) e Outro Thread (Runnabler1
no seu exemplo).Veja o código-fonte do
start()
método em classe ThreadNo código acima, você não pode ver a invocação para o
run()
métodoprivate native void start0()
é responsável por chamar orun()
método. A JVM executa esse método nativo.fonte
No primeiro caso, você está apenas invocando o
run()
método dor1
er2
objetos .No segundo caso, você está criando 2 novos Threads!
start()
vai ligarrun()
em algum momento!fonte
método run: - é um método abstrato criado originalmente na interface Runnable e substituído na classe Thread, bem como nas subclasses Thread (como o Thread implementa Runnable em seu código-fonte) e em qualquer outra classe de implementação da interface Runnable. - É usado para carregar o encadeamento (objeto executável) com a tarefa que se destina a executar, assim você o substitui para gravar essa tarefa.
método start: - é definido na classe Thread. Quando o método start é chamado em um objeto Thread 1, ele chama o método nativo internamente (não-java) chamado start0 (); método.
start0 (); método: é responsável pelo baixo processamento (criação de pilha para um encadeamento e alocação de encadeamento na fila do processador). Neste ponto, temos um encadeamento no estado Pronto / Executável.
2- No momento em que o agendador de encadeamentos decide que um encadeamento entra no núcleo do processador de acordo com o método de execução (prioridade do encadeamento e algoritmo de agendamento do SO), é invocado no objeto Runnable (seja o objeto de encadeamento Runnable atual ou o objeto Runnable passado) ao construtor de encadeamentos) aqui, um encadeamento entra em um estado de Execução e começa a executar sua tarefa (método de execução)
fonte
Os métodos start () e run () separados na classe Thread fornecem duas maneiras de criar programas encadeados. O método start () inicia a execução do novo thread e chama o método run (). O método start () retorna imediatamente e o novo thread normalmente continua até o método run () retornar.
O método run () da classe Thread não faz nada; portanto, as subclasses devem substituir o método pelo código a ser executado no segundo thread. Se um Thread for instanciado com um argumento Runnable, o método run () do thread executará o método run () do objeto Runnable no novo thread.
Dependendo da natureza do seu programa encadeado, chamar o método Thread run () diretamente pode fornecer a mesma saída que chamar pelo método start (), mas, no último caso, o código é realmente executado em um novo encadeamento.
fonte
A chamada do método Start () executa o método de substituição da classe estendida Thread e da interface dos implementos Runnable.
Mas, chamando run (), procura pelo método run, mas se a classe implementa a interface Runnable, chama o método run () substitui o método Runnable.
ex.:
`
`
fonte