Java: параметризованный выполнимый

Вот хороший пример: Brainnet 1 - Нейронный Проект Netwok - С Иллюстрацией И Кодом - Изучает Нейронную сеть, Программирующую Шаг за шагом, И Разрабатывает Простую Систему Обнаружения Почерка , который продемонстрирует некоторые практические применения программирования нейронной сети.

16
задан mschayna 2 November 2009 в 08:12
поделиться

5 ответов

Обычно вы реализуете Runnable или Callable как класс, который поддерживает общий входной параметр; например,

public class MyRunnable<T> implements Runnable {
  private final T t;

  public MyRunnable(T t) {
    this.t = t;
  }

  public void run() {
    // Reference t.
  }
}
13
ответ дан 30 November 2019 в 17:52
поделиться

Существует также com.google.common.base.Function из Google Collections Guava .

Если вы установите тип вывода на ? или Void (и всегда будете возвращать null ), вы можете использовать его как альтернативу Runnable ] с входным параметром.

Это имеет то преимущество, что можно использовать Functions.compose для преобразования входного значения, Iterables.transform для применения его к каждому элементу сбор и т. д.

9
ответ дан 30 November 2019 в 17:52
поделиться

Обычно, если вы хотите передать параметр в метод run () , вы создаете подкласс Runnable с конструктором, который принимает параметр .

Например, Вы хотите сделать это:

// code
Runnable r = new YourRunnable();
r.run(someParam);
//more code

Вам нужно сделать следующее:

// code
Runnable r = new YourRunnable(someParam);
r.run();
//more code

Вы реализуете YourRunnable , как показано ниже:

public class YourRunnable implements Runnable {
    Some param;
    public YourRunnable(Some param){
        this.param = param;
    }
    public void run(){
        // do something with param
    }
}
3
ответ дан 30 November 2019 в 17:52
поделиться

Я предлагаю определить интерфейс, как это сделано в исходном вопросе. Кроме того, избегайте слабой типизации, сделав интерфейс специфичным для того, что он должен делать, а не бессмысленный интерфейс, такой как Runnable .

0
ответ дан 30 November 2019 в 17:52
поделиться

Runnable не предназначен для непосредственного вызова клиентским кодом, например foo.run () , который будет выполняться последовательно в текущем потоке.

Из ] Runnable API :

Runnable интерфейс должен быть реализуется любым классом, чей экземпляры предназначены для исполнения по нитке. Класс должен определять метод без аргументов, называемый run.

Этот интерфейс предназначен для предоставления общий протокол для объектов, которые хотят выполнить код, пока они активный. Например, Runnable - это реализуется классом Thread. Быть активный просто означает, что поток имеет началось и еще не было остановлен.

Кроме того, Runnable предоставляет означает, что класс будет активен, пока не является подклассом Thread. Класс, который реализует Runnable может работать без создание подкласса Thread путем создания экземпляра Экземпляр потока и передача себя в как цель. В большинстве случаев Запускаемый интерфейс следует использовать, если вы только планируете переопределить run () и никакой другой поток методы. Это важно, потому что классы не должны быть подклассами если программист не намеревается изменение или усиление основных поведение класса.

Вместо этого вы создаете новый экземпляр Thread на основе вашего исполняемого файла, а затем вызываете bar.start () . В таком случае JVM должна вызвать run () в этом отдельном потоке.

Пример:

 public class Foo<E> implements Runnable {
     private final E e;
     public Foo(E e) { ... }
     @Override
     public void run() {
         do something with e.
     }
 }

 Foo<String> foo = new Foo("hello");
 Thread bar = new Thread(foo);
 bar.start();
-3
ответ дан 30 November 2019 в 17:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: