Вот хороший пример: Brainnet 1 - Нейронный Проект Netwok - С Иллюстрацией И Кодом - Изучает Нейронную сеть, Программирующую Шаг за шагом, И Разрабатывает Простую Систему Обнаружения Почерка , который продемонстрирует некоторые практические применения программирования нейронной сети.
Обычно вы реализуете Runnable
или Callable
как класс, который поддерживает общий входной параметр; например,
public class MyRunnable<T> implements Runnable {
private final T t;
public MyRunnable(T t) {
this.t = t;
}
public void run() {
// Reference t.
}
}
Существует также com.google.common.base.Function
из Google Collections Guava .
Если вы установите тип вывода на ?
или Void
(и всегда будете возвращать null
), вы можете использовать его как альтернативу Runnable
] с входным параметром.
Это имеет то преимущество, что можно использовать Functions.compose
для преобразования входного значения, Iterables.transform
для применения его к каждому элементу сбор и т. д.
Обычно, если вы хотите передать параметр в метод 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
}
}
Я предлагаю определить интерфейс, как это сделано в исходном вопросе. Кроме того, избегайте слабой типизации, сделав интерфейс специфичным для того, что он должен делать, а не бессмысленный интерфейс, такой как Runnable
.
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();