Скажем, у нас есть поток, обрабатывающий определенные инструкции и, следовательно, создающий промежуточные объекты результата, есть ли способ приостановить этот поток, а затем создать новый поток для возобновления с того места, где остановился предыдущий поток?
Произвольный пример:
Result result1 = foo();
Result result2 = fooAgain();
if(someCondition){
// save everything thats been computed so far and release this thread
}
Result result3 = notFoo();
// end of the method
// in a quartz scheduler or something
if(someCondition2){
// signal to resume the execution, but not from scratch instead from where its paused
}
поэтому мой вопрос в том, как мне этого добиться, а также как лучше всего сохранить промежуточные результаты
Решение проблемы
Похоже, вы не должны ничего останавливать. Вместо этого используйте один набор потоков, создающих промежуточные результаты и сохраняющих их где-нибудь. Затем создайте еще один набор потоков, которые находят эти промежуточные результаты и делают с ними что угодно.
Нет единого правильного ответа о том, как их сохранить в целом, это зависит от контекста. Но имело бы смысл использовать для этого какую-то очередь.
Эту настройку производитель-потребитель можно рассматривать как способ для потока возобновить задачу, начатую другим потоком. Промежуточный результат может включать информацию, указывающую, с какого шага необходимо начать выполнение задачи. Содержимое очереди может быть сохранено, чтобы его можно было восстановить после отключения системы и резервного копирования, чтобы можно было завершить ожидающие элементы.
Я видел, что происходит при использовании планировщика для выполнения задач. Система чередует циклы праздной траты с перегрузкой на работе. Когда таймер срабатывает, он запускает новую работу в систему независимо от того, есть ли у нее емкость. Вместо этого использование очередей позволяет противодействовать перегрузке и позволяет потребителям работать в стабильном темпе.
Комментариев нет:
Отправить комментарий