2012-03-12 4 views
1

У меня есть этот код C#:Java эквивалент C# Action.BeginInvoke

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

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

ответ

5

Это, как вы могли бы запустить действие в своем собственном потоке в Java:

new Thread(new Runnable() { 

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

Есть другие структуры более высокого уровня доступны, которые дают вам больше контроля о том, как вещи управляют такими как Executors, который может например, для schedule events.

+0

'BeginInvoke' будет использовать пул потоков, есть такое понятие в Java? - Извините, я должен был взять второй, чтобы следовать за вашей ссылкой «Исполнители»! Спасибо – weston

+0

Да: http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html – assylias

+0

Когда я пытаюсь это сделать, я получаю сообщение об ошибке «Метод run() типа new Runnable() {} должен переопределять метод суперкласса ". – adam0101

1

Это несколько связано с Asynchronous Event Dispatch in 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

2

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

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); 
Смежные вопросы