допустим, у меня есть метод doWork()
. Как мне вызвать его из отдельного потока (не из основного потока).
java
multithreading
Луи Рис
источник
источник
Ответы:
Создайте класс, реализующий
Runnable
интерфейс. Поместите код, который вы хотите запустить, вrun()
метод - это метод, который вы должны написать, чтобы соответствоватьRunnable
интерфейсу. В своем «основном» потоке создайте новыйThread
класс, передав конструктору экземпляр вашегоRunnable
, а затем вызовитеstart()
его.start
сообщает JVM, что нужно творить чудеса для создания нового потока, а затем вызывать вашrun
метод в этом новом потоке.Чтобы начать работу , ознакомьтесь с руководством по параллелизму в Java .
Если ваш метод будет вызываться часто, возможно, не стоит каждый раз создавать новый поток, поскольку это дорогостоящая операция. Вероятно, было бы лучше использовать какой-либо пул потоков. Посмотрите
Future
,Callable
,Executor
классов вjava.util.concurrent
пакете.источник
run()
Метод не принимает никаких параметров, так что вы не можете передать переменную там. Я предлагаю вам передать его в конструкторе - я отредактирую свой ответ, чтобы показать это.new Thread() { public void run() {myMethod();}}.start();
дорогу, она самая короткая?Runnable
- мой класс расширяетсяRunnable
. И поскольку я это сделал, у меня есть собственный конструктор, который передает состояние созданному объекту.или
или
или
или
источник
run()
?В Java 8 это можно сделать с помощью одной строчки кода.
Если ваш метод не принимает никаких параметров, вы можете использовать ссылку на метод:
В противном случае вы можете вызвать метод в лямбда-выражении:
источник
->
означает?Celery task queue
для асинхронных вещейЕще одним более быстрым вариантом вызова вещей (например, DialogBoxes и MessageBoxes и создания отдельных потоков для небезопасных методов) было бы использование выражения Lamba Expression
источник
Некоторое время назад я написал простой служебный класс, который использует службу исполнителя JDK5 и выполняет определенные процессы в фоновом режиме. Поскольку doWork () обычно имеет возвращаемое значение void, вы можете использовать этот служебный класс для его выполнения в фоновом режиме.
См. Статью, в которой я описал эту утилиту.
источник
Для этого с RxJava 2.x вы можете использовать:
В
subscribeOn()
методе определяет , какой планировщик для запуска действия на - RxJava имеет несколько предопределенных планировщиков, в том числе ,Schedulers.io()
который имеет пул потоки , предназначенные для операций ввода / вывода, иSchedulers.computation()
которая предназначена для процессоров интенсивных операций.источник
Если вы используете как минимум Java 8, вы можете использовать метод
runAsync
из класса CompletableFutureЕсли вам нужно вернуть результат, используйте
supplyAsync
вместо этогоисточник