допустим, у меня есть метод doWork(). Как мне вызвать его из отдельного потока (не из основного потока).
допустим, у меня есть метод doWork(). Как мне вызвать его из отдельного потока (не из основного потока).
Ответы:
Создайте класс, реализующий Runnableинтерфейс. Поместите код, который вы хотите запустить, в run()метод - это метод, который вы должны написать, чтобы соответствовать Runnableинтерфейсу. В своем «основном» потоке создайте новый Threadкласс, передав конструктору экземпляр вашего Runnable, а затем вызовите start()его. startсообщает JVM, что нужно творить чудеса для создания нового потока, а затем вызывать ваш runметод в этом новом потоке.
public class MyRunnable implements Runnable {
private int var;
public MyRunnable(int var) {
this.var = var;
}
public void run() {
// code in the other thread, can reference "var" variable
}
}
public class MainThreadClass {
public static void main(String args[]) {
MyRunnable myRunnable = new MyRunnable(10);
Thread t = new Thread(myRunnable)
t.start();
}
}
Чтобы начать работу , ознакомьтесь с руководством по параллелизму в Java .
Если ваш метод будет вызываться часто, возможно, не стоит каждый раз создавать новый поток, поскольку это дорогостоящая операция. Вероятно, было бы лучше использовать какой-либо пул потоков. Посмотрите Future, Callable, Executorклассов в java.util.concurrentпакете.
run()Метод не принимает никаких параметров, так что вы не можете передать переменную там. Я предлагаю вам передать его в конструкторе - я отредактирую свой ответ, чтобы показать это.
new Thread() { public void run() {myMethod();}}.start();дорогу, она самая короткая?
Runnable- мой класс расширяется Runnable. И поскольку я это сделал, у меня есть собственный конструктор, который передает состояние созданному объекту.
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
});
t1.start();
или
new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
}).start();
или
new Thread(() -> {
// code goes here.
}).start();
или
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
или
Executors.newCachedThreadPool().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
run()?
В Java 8 это можно сделать с помощью одной строчки кода.
Если ваш метод не принимает никаких параметров, вы можете использовать ссылку на метод:
new Thread(MyClass::doWork).start();
В противном случае вы можете вызвать метод в лямбда-выражении:
new Thread(() -> doWork(someParam)).start();
->означает?
Celery task queueдля асинхронных вещей
Еще одним более быстрым вариантом вызова вещей (например, DialogBoxes и MessageBoxes и создания отдельных потоков для небезопасных методов) было бы использование выражения Lamba Expression
new Thread(() -> {
"code here"
}).start();
Некоторое время назад я написал простой служебный класс, который использует службу исполнителя JDK5 и выполняет определенные процессы в фоновом режиме. Поскольку doWork () обычно имеет возвращаемое значение void, вы можете использовать этот служебный класс для его выполнения в фоновом режиме.
См. Статью, в которой я описал эту утилиту.
Для этого с RxJava 2.x вы можете использовать:
Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();
В subscribeOn()методе определяет , какой планировщик для запуска действия на - RxJava имеет несколько предопределенных планировщиков, в том числе , Schedulers.io()который имеет пул потоки , предназначенные для операций ввода / вывода, и Schedulers.computation()которая предназначена для процессоров интенсивных операций.
Если вы используете как минимум Java 8, вы можете использовать метод runAsyncиз класса CompletableFuture
CompletableFuture.runAsync(() -> {...});
Если вам нужно вернуть результат, используйте supplyAsyncвместо этого
CompletableFuture.supplyAsync(() -> 1);