Как вызвать метод с отдельным потоком в Java?



допустим у меня есть метод doWork(). Как я могу вызвать его из отдельного потока (не основной поток).

520   6  

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

    Ничего не найдено.