В вашем вопросе многое отсутствует (т. Е. Нет конкретного упоминания тем), но я все равно постараюсь ответить.
Ни блокировка, ни условные переменные не дают фоновых возможностей - они просто используются для потока, ожидающего сигналов от других потоков. Хотя вы не упоминаете об этом, метод disk.read(file)
может порождать поток для выполнения ввода-вывода, а затем немедленно возвращаться, но вызывающая сторона все равно будет сидеть в цикле readReady
, что кажется бессмысленным. Если вызывающий должен ждать, он может сам выполнить IO.
Лучшим примером может быть использование чего-то вроде сервиса Java 5 Executors:
ExecutorService pool = Executors.newFixedThreadPool(int numThreads);
Затем вы можете позвонить pool.submit(Callable)
, чтобы передать задание, которое будет выполнено в фоновом режиме, в другом потоке (когда у пула будет следующий доступный). Submit возвращает Future
, который вызывающий может использовать, чтобы выяснить, завершена ли фоновая задача. Он также может возвращать объект результата. Одновременные классы позаботятся о логике блокировки и условного сигнала / ожидания для вас.
Надеюсь, это поможет.
p.s. Кроме того, вы должны сделать readReady
энергозависимым, поскольку он не синхронизирован.