Quando você chamaria o Java em thread.run()
vez de thread.start()
?
java
multithreading
concurrency
em branco
fonte
fonte
t.run()
quando você deseja executart
a tarefa no thread atual et.start()
quando deseja executart
a tarefa not
próprio thread . Ou você está pedindo casos de uso reais?start()
! Como eu ... Este método não deve ser público!Respostas:
Você pode querer chamar run () em um teste de unidade específico que se preocupa estritamente com a funcionalidade e não com a simultaneidade.
fonte
Nunca. Chamar run () diretamente apenas executa o código de forma síncrona (no mesmo thread), assim como uma chamada de método normal.
fonte
Retirado do FAQ dos threads de estilo de código Java :
fonte
thread's run() method executes the run() method of the Runnable object in the new thread instead.
Isso não é verdade (ou pelo menos meu código-fonte Java 8 diz o contrário), mas infelizmente o link parece quebrado, então eu relato o erro aqui.thread.run()
vez dethread.start()
.A execução
thread.run()
não cria um novoThread
no qual seu código é executado. Ele apenas executa o código no Thread atual a partir do qual othread.run()
código é invocado.A execução
thread.start()
cria um novo thread de nível de sistema operacional em que orun()
método é chamado.Em essência:
Além disso, como outros mencionaram, 'teste' parece ser o único caso aconselhável em que você pode invocar
run()
diretamente do seu código.fonte
Isso já foi mencionado, mas só para ficar claro: criar um novo objeto Thread apenas para chamar seu método run () é desnecessariamente caro e deve ser um grande sinal de alerta. Seria um design muito melhor e mais desacoplado criar um Runnable impl e (a) chamar seu método run () diretamente se esse for o comportamento desejado, ou (b) construir um novo Thread com esse Runnable e iniciar o Thread.
Melhor ainda, para ainda mais desacoplamento, verifique a
Executor
interface e a estrutura no JDK 5 e mais recente. Isso permite a você, em poucas palavras, desacoplar a execução da tarefa (a instância Runnable) de como ela é executada (a implementação do Executor, que pode executar o Runnable no Thread atual, em um novo Thread, usando um Thread existente de um pool, e o que não).fonte
Ligue
thread.start()
, ele por sua vez ligaráthread.run()
. Não consigo pensar em um caso em que você gostaria de contornarthread.start()
e ir diretamente parathread.run()
fonte
Os métodos separados
start()
erun()
na classe Thread fornecem duas maneiras de criar programas encadeados. Ostart()
método inicia a execução da nova thread e chama orun()
método. Ostart()
método retorna imediatamente e o novo thread normalmente continua até que orun()
método retorne.O
run()
método da classe Thread não faz nada, então as subclasses devem sobrescrever o método com o código a ser executado no segundo thread. Se um Thread for instanciado com um argumento Runnable, orun()
método do thread executa orun()
método do objeto Runnable no novo thread.Dependendo da natureza do seu programa encadeado, chamar o
run()
método Thread diretamente pode dar a mesma saída que chamar por meio dostart()
método, mas no último caso o código é realmente executado em um novo encadeamento.referência
fonte
The start() method returns immediately and the new thread normally continues until the run() method returns.
Sestart()
retornar imediatamente, como é que orun()
continua a funcionar, visto que foi chamado destart()
Se a pergunta era - "por que o método de início de thread é chamado em vez do método de execução diretamente", respondi com um código de exemplo abaixo. Espero que isso esclareça. No exemplo abaixo:
fonte
Quando você quiser que ele seja executado de forma síncrona. Chamar o método run não dará a você multithreading. O método start cria uma nova thread que chama o método run.
fonte
Se você deseja executar o conteúdo de run () como faria com qualquer outro método. Para não começar um tópico, é claro.
fonte
Supondo que você saiba o uso do método de início e execução, ou seja, síncrono vs. assíncrono; O método run pode ser usado apenas para testar a funcionalidade.
Além disso, em algumas circunstâncias, a mesma classe de thread pode ser usada em dois lugares diferentes com requisitos de funcionalidade de sincronização e assincronização, tendo dois objetos diferentes com um método de execução e outro método de início sendo invocado.
fonte
Pelo menos no JVM 1.6., Há um pouco de verificação e a execução é chamada nativamente:
fonte
Apenas uma observação aos ótimos comentários acima: às vezes você escreve um código multi-thread que usa o método "start" para executar diferentes threads. Você verá que é muito mais fácil usar "run" (em vez de "start) para depuração, pois isso torna o código executado de maneira síncrona e a depuração é muito mais fácil.
fonte
fonte