#java #многопоточность
Как наиболее оптимально из главного потока приостановить дочерний поток (Thread и Runnable) на неограниченное время, а затем его возобновить?
Ответы
Ответ 1
Не пользуйтесь методами Thread.suspend() и Thread.resume(). Это лучше осуществить с помощью wait()/notify().Ответ 2
Обновление Вы не можете «приостановить» чужой поток. Потоки должны сотрудничать для этого. Самый простой метод, наверное — использовать обыкновенный Lock. Вот пример: import java.time.*; import java.util.concurrent.locks.*; class Test { static Lock lock = new ReentrantLock(); public static void main (String[] args) throws java.lang.Exception { Thread worker = new Thread(() -> { try { for (int i = 0; i < 20; i++) { Thread.sleep(20); // если lock взят, мы будет ждать здесь // если нет, мы его берём и тут же отпускаем lock.lock(); lock.unlock(); System.out.println(LocalTime.now()); } } catch (InterruptedException ex) { } }); worker.start(); Thread.sleep(100); System.out.println("Locking..."); lock.lock(); // теперь lock.lock() в другом потоке будет ждать Thread.sleep(500); lock.unlock(); // в теперь не будет System.out.println("Unlocked"); worker.join(); } } Пару из lock.lock(); lock.unlock(); нужно расставить по тем местам, где рабочий поток должен будет проверять, не нужно ли приостановиться. Это и есть «сотрудничество» — поток сам вызывает возможно блокирующий код в тех местах, где он хочет проверить, не нужно ли ему приостановиться.
Комментариев нет:
Отправить комментарий