Utilice un ExecutorService.
Sin embargo, hay algunas cosas que debes hacer, marcar el hilo como un daemon para que atleast no atorgue a tomcat en situaciones de error, y debes detener el ejecutor cuando se destruya tu contexto de servlet (por ejemplo, cuando vuelves a implementar o detener su aplicación para ello, utilice un ServletContextListener:.
public class ExecutorContextListener implements ServletContextListener {
private ExecutorService executor;
public void contextInitialized(ServletContextEvent arg0) {
ServletContext context = arg0.getServletContext();
int nr_executors = 1;
ThreadFactory daemonFactory = new DaemonThreadFactory();
try {
nr_executors = Integer.parseInt(context.getInitParameter("nr-executors"));
} catch (NumberFormatException ignore) {}
if(nr_executors <= 1) {
executor = Executors.newSingleThreadExecutor(daemonFactory);
} else {
executor = Executors.newFixedThreadPool(nr_executors,daemonFactory);
}
context.setAttribute("MY_EXECUTOR", executor);
}
public void contextDestroyed(ServletContextEvent arg0) {
ServletContext context = arg0.getServletContext();
executor.shutdownNow(); // or process/wait until all pending jobs are done
}
}
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
/**
* Hands out threads from the wrapped threadfactory with setDeamon(true), so the
* threads won't keep the JVM alive when it should otherwise exit.
*/
public class DaemonThreadFactory implements ThreadFactory {
private final ThreadFactory factory;
/**
* Construct a ThreadFactory with setDeamon(true) using
* Executors.defaultThreadFactory()
*/
public DaemonThreadFactory() {
this(Executors.defaultThreadFactory());
}
/**
* Construct a ThreadFactory with setDeamon(true) wrapping the given factory
*
* @param thread
* factory to wrap
*/
public DaemonThreadFactory(ThreadFactory factory) {
if (factory == null)
throw new NullPointerException("factory cannot be null");
this.factory = factory;
}
public Thread newThread(Runnable r) {
final Thread t = factory.newThread(r);
t.setDaemon(true);
return t;
}
}
que tendrá que añadir el detector contexto a su web.xml, donde también se puede especificar el número de hilos que querrá correr los trabajos de fondo:
<listener>
<listener-class>com.example.ExecutorContextListener</listener-class>
</listener>
Puedes acceder al ejecutor de su servlet y enviar los trabajos a la misma:
ExecutorService executor = (ExecutorService)getServletContext().getAttribute("MY_EXECUTOR");
...
executor.submit(myJob);
Si está utilizando la primavera, todo esto probablemente se puede hacer aún simpler
¿Espera para dar una respuesta de vuelta? Además, Tomcat utiliza grupos de subprocesos que pueden expandirse cuando sea necesario para atender múltiples solicitudes simultáneas. –
¿Necesita volver a mostrar a los usuarios los resultados de las "solicitudes de minería de datos" (o al menos notificarlos sobre los trabajos completados)? ¿Y cómo necesitas hacer eso? –
Estaba pensando que cuando se termina un trabajo, el usuario puede ser enviado por correo electrónico para decir que los resultados están disponibles. –