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

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

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

1
adam0101 12 Мар 2012 в 18:44

3 ответа

Лучший ответ

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

new Thread(new Runnable() {

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

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

5
assylias 12 Мар 2012 в 14:47

Изначально 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);
2
Joel 12 Мар 2012 в 14:52

Это в некоторой степени связано с асинхронной отправкой событий в 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

1
Community 23 Май 2017 в 12:05