Смотрите, тут слово Activity
лучше заменить на MainThread (UI Thread
). То есть у Вас есть два потока, один главный, другой порожденный.
Если Вам нужно передать данные в потом перед стартом( метод start
), то тут все очень просто, Вы можете создать собственный класс и наследоваться от Thread.Вот маленький пример
// Somewhere in activity
String someText = "Hello World!";
Thread myThread = new CustomThread(someText);
public class CustomThread
{
private passedString;
public CustomThread(String inputText) {
this.passedString = inputText;
}
@Override
public void run() {
System.out.println(this.passedString);
//Do some stuff
}
}
Если же Вы хотите передавать данные в уже запущенный работающий поток можно поступить несколькими способами.
Можно сделать переменную булевую в классе потока и в цикле, например, пока она не истинна, то делать, что-то, как только истинна, то прочитать глобальную статическую переменную общую или же сделать метод, который устанавливает переменную объекта кастомного потока, при установлении флага будет перечитывать новое значение.Если надо- напишите, я покажу пример.
Или же способ покрасивее это использовать блокирующую очередь.. Тут паттерн многопоточного программирования Consumer && Producer
используется. Вот пример
final BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
Thread myThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
System.out.println(queue.take());
} catch (InterruptedException e) {
// Handle Error
System.err.println("Error:" + e);
}
}
}
});
myThread.start();
queue.offer("Hello World");
}
Я честно говоря точно не уверен, что это все возможные способы, может кто-то еще знает.