У меня есть веб-служба REST, которая обслуживает HTTP-запросы. После того, как данные извлечены из базы данных, я хотел бы запустить фоновый поток и начать анализ данных, что требует дополнительного времени для завершения. И эти данные не имеют ничего общего с ответом, мы просто регистрируем вычисленный анализ.
Я попробовал следующий метод, основанный на моем собственном понимании концепции потоков. Но в обоих случаях ответ HTTP возвращается сразу после выполнения фоновых вычислений, поэтому в основном поток вычислений и исходный поток не являются асинхронными, и поток вычислений останавливает поток ответа до завершения анализа.
Запущен поток демона. Я ожидал, что поток демона будет работать в фоновом режиме, пока метод HTTP отправляет ответ. Но неправда. Ответ отображается только после выполнения вычисления в этом потоке. Разве потоки демона не должны работать в фоновом режиме, даже когда родительский поток завершает работу? (Пожалуйста, прочитайте комментарии Джеймса, чтобы узнать, как запуск демона мог быть здесь проблемой)
Callable<Boolean> computeCallable = new CallableComputeProcess();
Thread t=new Thread(computeCallable);
t.setDaemon(true);
t.start();
P.S. Вычислительный поток — это дочерний поток, который я создал внутри родительского потока.
Есть ли способ асинхронно запустить поток, который позволяет фоновым вычислениям просто выполняться в фоновом режиме, не останавливая ответ http?
t.setDaemon()
, то, вероятно, это плохая идея. В терминологии Java поток демона — это поток, который будет автоматически уничтожен, если в программе не останется других потоков, не являющихся демонами. Вы, вероятно, не хотите, чтобы поток автоматически уничтожался, пока он выполняет полезные вычисления. Вы должны вызыватьsetDaemon()
только в том случае, если единственной целью потока является предоставление некоторых услуг другим потокам. - person Solomon Slow   schedule 16.02.2017