Одним из способов передачи данных в работающий поток является реализация очереди сообщений .Поток, который хочет, чтобы прослушивающий поток что-то сделал, добавил бы элемент в очередь прослушивающего потока.Поток прослушивания читает из этого потока блокирующим образом.Вызывает ожидание, когда нет действий для выполнения.Всякий раз, когда другой поток помещает сообщение в очередь, он извлекает сообщение, в зависимости от элемента и его содержимого, тогда вы можете что-то с ним сделать.
Это некоторый код Java / псевдокод:
class Listener
{
private Queue queue;
public SendMessage(Message m)
{
// This will be executed in the calling thread.
// The locking will be done either in this function or in the Add below
// depending on your Queue implementation.
synchronize(this.queue)
{
this.queue.put(m);
}
}
public Loop()
{
// This function should be called from the Listener thread.
while(true)
{
Message m = this.queue.take();
doAction(m);
}
}
public doAction(Message m)
{
if (m is StopMessage)
{
...
}
}
}
И вызывающая сторона:
class Caller
{
private Listener listener;
LetItStop()
{
listener.SendMessage(new StopMessage());
}
}
Конечно, существует много лучших практик при программировании параллельного / параллельного кода.Например, вместо while(true)
вы должны по крайней мере добавить поле типа run
:: Bool, которое вы можете установить в false при получении StopMessage.В зависимости от языка, на котором вы хотите реализовать это, у вас будут другие примитивы и поведение для работы.
Например, в Java вы можете использовать пакет java.util.Concurrent
для сохранениявсе просто для тебя.