6 ответов:
создать класс, который реализует
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пакета.
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(); } });
в Java 8, вы можете сделать это с помощью одной строки кода.
Если ваш метод не принимает никаких параметров, вы можете использовать ссылки на метод:
new Thread(MyClass::doWork).start();в противном случае вы можете вызвать метод в лямбда-выражение:
new Thread(() -> doWork(someParam)).start();
некоторое время назад я написал простой служебный класс, который использует службу исполнителя JDK5 и выполняет определенные процессы в фоновом режиме. Поскольку doWork () обычно имеет возвращаемое значение void, вы можете использовать этот служебный класс для его выполнения в фоновом режиме.
посмотреть в этой статье где я задокументировал эту утилиту.
еще один более быстрый вариант вызова вещей (например, диалоговых окон и MessageBoxes и создание отдельных потоков для не-потокобезопасных методов) было бы использовать выражение Lamba
new Thread(() -> { "code here" }).start();
чтобы достичь этого с помощью RxJava 2.X вы можете использовать:
Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();The
subscribeOn()метод указывает, какой планировщик для выполнения действия на - RxJava имеет несколько предопределенных планировщиков, в том числеSchedulers.io(), который имеет пул потоков, предназначенных для операций ввода-вывода, иSchedulers.computation(), который предназначен для интенсивных операций процессора.
Comments