2013-09-27 3 views
0

Использование java, есть ли способ ссылаться на метод и динамически возникать в потоке?Java Dynamic Method Thread Spawning

Например, если у вас есть метод, называемый spawn(), который принимает параметр другой ссылки на метод, и он затем выдает поток, который будет запускать ссылочный метод. Я полагаю, код будет выглядеть примерно так:

void spawn(**wayToReferenceANumberOfDifferentMethods currentMethodToLaunch**) { 
    new Thread(){ 
     public void run() { 
      // **way to launch the currentMethodToLaunch** 
     } 
    }.start(); 
} 

Для того, чтобы выше, чтобы работать, я думаю, что мне нужно, чтобы иметь возможность ссылаться на тип из method. Если это невозможно, можно быстро рассказать о том, почему следует оценивать.

+1

Что вы пытаетесь сделать, для того чтобы объекты класса первого класса рассматривались в качестве объектов первого класса, Это означает, что вы можете объявить функцию и передать ее в качестве аргумента другой функции. Java не поддерживает это. В java 8 однако вы можете передать встроенное тело функции с выражением лямбда: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html – ylabidi

ответ

5

Строго говоря? Нет. Java не является функциональным языком, методы не являются объектами и не могут передаваться в качестве параметров.

Однако такого рода общее поведение может быть выполнено с помощью ExecutorService и Runnable/Callable.

Взгляните на документ java для ExecutorService.

Редактировать

Кроме того, можно абстрагировать асинхронное выполнение с использованием различных механизмов. Например, используя аннотацию @Async в структуре Spring.

1

Вы можете передать объект, который реализует Runnable для метода spawn.

void spawn(Runnable myRunnable) { 
    Thread thread = new Thread(myRunnable); 
    thread.start(); 
} 

У вас может быть несколько классов, реализующих интерфейс Runnable, каждый из которых выполняет что-то другое. Объект, который вы передаете методу spawn, определит, какой из них действительно будет выполняться.

Вот что класс, который реализует Runnable будет выглядеть так:

public class MyClass implements Runnable 
{ 
    public void run()  
    { 
    // do what you need here 
    } 
} 

До Java 8, интерфейсы не были использованы для «передать методы вокруг», как описано выше. С Java 8 у вас есть выражения лямбда, которые позволяют вам лучше имитировать это поведение.

+0

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

+0

@Aurand - это совершенно другое соображение, о котором OP не обязательно спрашивает.Независимо от того, используете ли вы службу исполнителя или отдельные потоки, это решение основано на многих факторах. Не зная точно, для чего это используется, было бы преждевременно объявлять это как задачу, наиболее подходящую для службы исполнителя. Кроме того, OP работал с потоком, поэтому я сохранил его как можно более похожий на его код. – stepanian

0

Как и другие ответы, вы, вероятно, просто хотите передать в Runnable s или Callable s и использовать их в качестве основы для выполнения метода.

Однако, если вы действительно хотите пройти методы, вы можете использовать Reflection API, чтобы выполнить это. Это несколько громоздко, но это определенно выполнимо.

+0

Это технически означает передачу экземпляра объекта, членом которого является этот метод, и его вызова. Его вопросы больше намекают на возможность передачи функций вокруг, без необходимости привязки к классу, как в чистых функциональных языках или языках, которые имеют достойную поддержку функциональной парадигмы. – ylabidi