Java-эквивалент C # Action.BeginInvoke - PullRequest
1 голос
/ 12 марта 2012

У меня есть этот код C #:

Action action = MyFunction;
action.BeginInvoke(action.EndInvoke, action);

который, насколько я могу судить, просто запускает MyFunction асинхронно. Можете ли вы сделать то же самое в Java?

Ответы [ 3 ]

5 голосов
/ 12 марта 2012

Вот как вы можете запустить действие в своем собственном потоке в Java:

new Thread(new Runnable() {

    @Override
    public void run() {
        aFunctionThatRunsAsynchronously();
    }
}).start();

Существуют другие доступные высокоуровневые инфраструктуры, которые дают вам больше контроля над тем, как все выполняется, такие как Исполнители , которые, например, могут использоваться для планирования событий .

2 голосов
/ 12 марта 2012

Собственно, ExecutorService предоставляет наиболее близкую мне идею.Вот как вы можете использовать ExecutorService, чтобы запустить метод async, а затем получить возвращаемое значение:

ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
Future<String> future = executor.submit(new Callable<String>() {
    return getSomeLongRunningSomethingHere();
});
//... do other stuff here
String rtnValue = future.get(); //get blocks until the original finishes running 
System.out.println(rtnValue);
1 голос
/ 12 марта 2012

Это в некоторой степени связано с Асинхронной отправкой событий в Java . По сути, вы можете структурировать метод, который хотите запустить, как класс, реализующий Callable или Runnable. Java не имеет возможности ссылаться на «группу методов» как переменную или параметр, как в C #, поэтому даже обработчики событий в Java являются классами, реализующими интерфейс, определяющий слушателя.

Попробуйте что-то вроде этого:

Executor scheduler = Executors.newSingleThreadExecutor();

//You'd have to change MyFunction to be a class implementing Callable or Runnable
scheduler.submit(MyFunction);

Больше чтения из документов Oracle Java:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executors.html

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html

...