Может кто-нибудь предложить мне, как я могу передать параметр в поток?
Кроме того, как это работает для анонимных классов?
java
multithreading
Стив
источник
источник
Consumer<T>
.Ответы:
Вам необходимо передать параметр в конструкторе объекту Runnable:
и вызвать его так:
источник
r
будет иметь один и тот же аргумент, поэтому, если мы хотим передать разные аргументы нескольким запущенным потокам,MyThread
нам нужно будет создать новыйMyThread
экземпляр, используя требуемый аргумент для каждого потока. Другими словами, чтобы запустить поток, нам нужно создать два объекта: Thread и MyThread. Считается ли это плохим с точки зрения производительности?Для анонимных классов:
В ответ на редактирование вопроса вот как это работает для анонимных классов
Названные классы:
У вас есть класс, расширяющий Thread (или реализующий Runnable), и конструктор с параметрами, которые вы хотите передать. Затем, когда вы создаете новый поток, вы должны передать аргументы, а затем запустить поток, примерно так:
Runnable - намного лучшее решение, чем Thread BTW. Поэтому я бы предпочел:
Этот ответ в основном такой же, как этот похожий вопрос: как передать параметры объекту Thread
источник
parameter
напрямую изrun()
метода без использования поля, какp
на всех. Вроде работает. Есть некоторые тонкие многопоточность , что мне не хватает не копироватьparameter
наp
заранее?)
в первом примереfinal X parameter
доnew Runnable()
линии, то я мог получить доступparameter
внутрьrun()
. Мне не нужно было делать лишнееp = parameter
.final
уже не так важно; достаточно, если переменная является окончательной (несмотря на то, что она не причиняет вреда)через конструктор класса Runnable или Thread
источник
@Override
?@Override
явно заявляет, что переопределяет абстрактный метод в классе Thread.Этот ответ приходит очень поздно, но, возможно, кто-то найдет его полезным. Речь идет о том, как передать параметр (ы) в
Runnable
даже без объявления именованного класса (удобно для вкладчиков):Конечно, вы можете отложить исполнение
start
до более удобного или подходящего момента. И вам решать, какой будет сигнатураinit
метода (так что он может принимать больше и / или другие аргументы) и, конечно, даже его имя, но в основном вы понимаете.На самом деле есть и другой способ передачи параметра в анонимный класс с использованием блоков инициализатора. Учти это:
Так что все происходит внутри блока инициализатора.
источник
this.myParam
тогда действительно ли это необходимо? Не могли бы вы просто отбросить приватные переменные и обратиться к переменной из внешней области видимости? Я понимаю (конечно), что это имеет некоторые последствия, такие как переменная, открытая для изменения после запуска потока.Когда вы создаете поток, вам нужен экземпляр
Runnable
. Самый простой способ передать параметр - передать его в качестве аргумента в конструктор:Если затем вы хотите изменить параметр во время работы потока, вы можете просто добавить метод setter в свой класс runnable:
Если у вас есть это, вы можете изменить значение параметра, вызвав так:
Конечно, если вы хотите инициировать действие при изменении параметра, вам придется использовать блокировки, которые значительно усложняют ситуацию.
источник
Чтобы создать поток, вы обычно создаете собственную реализацию Runnable. Передайте параметры потоку в конструкторе этого класса.
источник
Вы можете расширить или предоставить и предоставить параметры по своему усмотрению. Есть простые примеры в документации . Я перенесу их сюда:
Thread
class
Runnable
class
источник
Либо напишите класс, который реализует Runnable, и передайте все, что вам нужно, в соответствующем определенном конструкторе, или напишите класс, который расширяет Thread соответствующим образом определенным конструктором, который вызывает super () с соответствующими параметрами.
источник
Начиная с Java 8, вы можете использовать лямбду для захвата параметров, которые являются окончательными . Например:
источник
В Java 8 вы можете использовать
lambda
выражения с Concurrency API иExecutorService
заменой более высокого уровня для работы с потоками напрямую:Смотрите также
executors
Javadocs .источник
Я знаю, что опоздал на несколько лет, но я столкнулся с этой проблемой и принял неортодоксальный подход. Я хотел сделать это без создания нового класса, так что вот что я придумал:
источник
Передача параметров через методы start () и run ():
источник
Вы можете получить класс из Runnable и во время построения (скажем) передать параметр в.
Затем запустите его с помощью Thread.start (Runnable r);
Если вы имеете в виду во время работы потока, просто сохраните ссылку на ваш производный объект в вызывающем потоке и вызовите соответствующие методы установки (синхронизация, где это необходимо)
источник
Существует простой способ передачи параметров в runnables. Код:
источник
Нет, вы не можете передать параметры в
run()
метод. Об этом говорит подпись (у нее нет параметров). Вероятно, самый простой способ сделать это - использовать объект специального назначения, который принимает параметр в конструкторе и сохраняет его в конечной переменной:Как только вы это сделаете - вы должны быть осторожны с целостностью данных объекта, который вы передаете в «Рабочую задачу». Теперь данные будут существовать в двух разных потоках, поэтому вы должны убедиться, что они безопасны для потоков.
источник
Еще один вариант; этот подход позволяет использовать элемент Runnable, например, вызов асинхронной функции. Если вашей задаче не нужно возвращать результат, например, она просто выполняет какое-то действие, вам не нужно беспокоиться о том, как вы передадите «результат».
Этот шаблон позволяет вам повторно использовать элемент, где вам нужно какое-то внутреннее состояние. Когда не передаются параметры в конструктор, необходимо обеспечить доступ программ к параметрам. Вам может понадобиться больше проверок, если в вашем сценарии использования участвуют разные абоненты и т. Д.
}
Поток t = новый поток (новый MyRunnable (параметр)); t.start ();
Если вам нужен результат обработки, вам также нужно будет координировать завершение MyRunnable после завершения подзадачи. Вы можете перезвонить или просто подождать в потоке 't' и т. Д.
источник
Специально для Android
Для целей обратного вызова я обычно реализую свой собственный шаблон
Runnable
с входными параметрами:Использование простое:
В менеджере:
источник
Создайте локальную переменную в вашем классе, что
extends Thread
илиimplements Runnable
.Таким образом, вы можете передать переменную при запуске.
Выход:
источник