Как асинхронно вызывать метод в Java - PullRequest
92 голосов
/ 03 декабря 2009

В последнее время я смотрел на goroutines Go и думал, что было бы неплохо иметь что-то подобное в Java. Насколько я искал, общий способ распараллеливания вызова метода - сделать что-то вроде:

final String x = "somethingelse";
new Thread(new Runnable() {
           public void run() {
                x.matches("something");             
    }
}).start();

Это не очень элегантно. Есть ли лучший способ сделать это? Мне нужно было такое решение в проекте, поэтому я решил реализовать свой собственный класс-оболочку вокруг вызова асинхронного метода.

Я опубликовал свой класс-обертку в J-Go . Но я не знаю, хорошее ли это решение. Использование простое:

SampleClass obj = ...
FutureResult<Integer> res = ...
Go go = new Go(obj);
go.callLater(res, "intReturningMethod", 10);         //10 is a Integer method parameter
//... Do something else
//...
System.out.println("Result: "+res.get());           //Blocks until intReturningMethod returns

или менее подробный:

Go.with(obj).callLater("myRandomMethod");
//... Go away
if (Go.lastResult().isReady())                //Blocks until myRandomMethod has ended
    System.out.println("Method is finished!");

Внутренне я использую класс, который реализует Runnable и выполняет некоторую работу Reflection, чтобы получить правильный объект метода и вызвать его.

Мне нужно мнение о моей крошечной библиотеке и о том, как делать вызовы асинхронных методов в Java. Это безопасно? Есть ли уже более простой способ?

Ответы [ 11 ]

0 голосов
/ 26 марта 2019

Java также предоставляет хороший способ вызова асинхронных методов. в java.util.concurrent у нас есть ExecutorService , который помогает в этом. Инициализируйте ваш объект следующим образом -

 private ExecutorService asyncExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

, а затем вызвать функцию как-

asyncExecutor.execute(() -> {

                        TimeUnit.SECONDS.sleep(3L);}
...