digamos que eu tenho um método doWork()
. Como eu o chamo de um thread separado (não do thread principal).
java
multithreading
Louis Rhys
fonte
fonte
Respostas:
Crie uma classe que implemente a
Runnable
interface. Coloque o código que você deseja executar norun()
método - esse é o método que você deve escrever para estar em conformidade com aRunnable
interface. No seu segmento "principal", crie uma novaThread
classe, passando ao construtor uma instância do seu eRunnable
, em seguida, chamestart()
-o.start
diz à JVM para fazer a mágica para criar um novo encadeamento e, em seguida, chame seurun
método nesse novo encadeamento.Dê uma olhada no tutorial de simultaneidade do Java para começar.
Se seu método for chamado com frequência, pode não valer a pena criar um novo encadeamento a cada vez, pois essa é uma operação cara. Provavelmente seria melhor usar algum tipo de pool de threads. Ter um olhar para
Future
,Callable
,Executor
classes nojava.util.concurrent
pacote.fonte
run()
método não usa parâmetros, portanto você não pode passar uma variável para lá. Sugiro que você o passe no construtor - editarei minha resposta para mostrar isso.new Thread() { public void run() {myMethod();}}.start();
caminho, é o mais curto?Runnable
- mine é uma classe que se estendeRunnable
. E porque fiz isso, tenho meu próprio construtor, que passa o estado para o objeto instanciado.ou
ou
ou
ou
fonte
run()
?No Java 8, você pode fazer isso com uma linha de código.
Se o seu método não usar nenhum parâmetro, você poderá usar uma referência de método:
Caso contrário, você pode chamar o método em uma expressão lambda:
fonte
->
significa?Celery task queue
para para o material assíncronoOutra opção mais rápida de chamar coisas (como DialogBoxes e MessageBoxes e criar threads separados para métodos seguros não relacionados a threads) seria usar a expressão Lamba
fonte
Algum tempo atrás, eu escrevi uma classe de utilitário simples que usa o serviço executor JDK5 e executa processos específicos em segundo plano. Como doWork () normalmente teria um valor de retorno nulo, convém usar essa classe de utilitário para executá-lo em segundo plano.
Veja este artigo onde eu havia documentado esse utilitário.
fonte
Para conseguir isso com o RxJava 2.x, você pode usar:
O
subscribeOn()
método especifica em qual agendador executar a ação - o RxJava possui vários agendadores predefinidos, incluindoSchedulers.io()
um conjunto de encadeamentos destinado a operações de E / S eSchedulers.computation()
qual é destinado a operações intensivas da CPU.fonte
Se você estiver usando pelo menos Java 8, poderá usar o método
runAsync
da classe CompletableFutureSe você precisa retornar um resultado use
supplyAsync
vezfonte