Это было бы довольно простым промежуточным ПО Ring:
(defn wrap-dir-index [handler]
(fn [req]
(handler
(update-in req [:uri]
#(if (= "/" %) "/index.html" %)))))
Просто оберните ваши маршруты с помощью этой функции, и запросы на /
преобразуются в запросы на /index.html
до того, как остальная часть вашего кода увидит им.
(def app (-> (routes (your-dynamic-routes)
(resources "/"))
(...other wrappers...)
(wrap-dir-index)))
Чтобы иметь возможность вызывать notify () , вам необходимо выполнить синхронизацию на том же объекте.
synchronized (someObject) {
someObject.wait();
}
/* different thread / object */
synchronized (someObject) {
someObject.notify();
}
Вы можете вызывать notify только для объектов, монитор которых у вас есть. Итак, вам нужно что-то вроде
synchronized(threadObject)
{
threadObject.notify();
}
Вам вообще нужно это потоковое? Мне интересно, насколько велики ваши матрицы, и есть ли какая-то польза от печати одним потоком, в то время как другой выполняет умножение.
Возможно, стоит измерить это время, прежде чем выполнять относительно сложную работу с потоками?
Если вам действительно нужно его распределять, я бы создал 'n' потоков для выполнения умножения ячеек (возможно, 'n' - это количество доступных вам ядер), а затем используйте механизм ExecutorService и Future для одновременной отправки нескольких умножений.
Таким образом, вы можете оптимизировать работу в зависимости от количества ядер и использовать инструменты потоковой передачи Java более высокого уровня (которые должны облегчить жизнь). Запишите результаты обратно в принимающую матрицу, а затем просто распечатайте ее, когда все ваши будущие задачи будут выполнены.