У меня есть веб-служба REST, которая обслуживает HTTP-запросы. После того, как данные извлекаются из базы данных, я хотел бы запустить фоновый поток и начать анализ данных, для чего требуется некоторое дополнительное время. И эти данные не имеют никакого отношения к ответу, мы просто регистрируем вычисляемый анализ.Как выполнить фоновые вычисления в асинхронном потоке (в веб-службе REST)
Я пробовал следующий метод, основанный на моем собственном понимании концепции Threads. Но в обоих случаях HTTP-ответ возвращается сразу после завершения фонового вычисления, поэтому в основном поток вычислений и исходный поток не являются асинхронными, и поток вычислений останавливает поток ответов до тех пор, пока анализ не будет выполнен.
Начато нить демона. Я ожидал, что поток демона будет запущен в фоновом режиме, а HTTP-метод отправит ответ. Но это не так. Ответ отображается только после того, как вычисление выполняется в этом потоке. Не предполагается ли, что потоки демона выполняются в фоновом режиме, даже когда родительский поток завершается? (Пожалуйста, прочитайте комментарии Джеймсу, чтобы узнать, как начать демон, возможно, была проблема здесь)
Callable<Boolean> computeCallable = new CallableComputeProcess();
Thread t=new Thread(computeCallable);
t.setDaemon(true);
t.start();
P.S: Исчисление нить ребенок нить я создал внутри родительского потока.
Есть ли способ запустить поток асинхронно, что позволяет фоновым вычислениям запускаться только в фоновом режиме без остановки ответа HTTP?
Re: "Я ожидал, что демон нить ... Но ..." Если вы хотите, чтобы кто-то объясните, почему ваш код сделал все, что он сделал, тогда вам нужно будет показать нам код. –
Несомненно @jameslarge. Добавление кода через мгновение. – kai
Re, «Начал поток демона». Если это означает, что вы вызвали 't.setDaemon()', то это, вероятно, плохая идея. В терминологии Java поток «daemon» - это поток, который будет автоматически убит, если в программе не осталось других ничейных нитей. Вероятно, вы не хотите, чтобы поток был автоматически убит, пока он делает полезное вычисление. Вы должны только называть 'setDaemon()', если единственная цель потока - предоставить некоторую услугу другим потокам. –