Страницы

Поиск по вопросам

вторник, 25 февраля 2020 г.

Приостановка потока на неограниченное время

#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(); нужно расставить по тем местам, где рабочий поток должен будет проверять, не нужно ли приостановиться. Это и есть «сотрудничество» — поток сам вызывает возможно блокирующий код в тех местах, где он хочет проверить, не нужно ли ему приостановиться.

Комментариев нет:

Отправить комментарий