Q:

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

Как наиболее оптимально из главного потока приостановить дочерний поток (Thread и Runnable) на неограниченное время, а затем его возобновить? 

A:

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

A:

Не пользуйтесь методами Thread.suspend() и Thread.resume().
Это лучше осуществить с помощью wait()/notify().

