Javascript no maneja hilos (o threads). Es una realidad. El browser dedica un único hilo de ejecución a cada página, y no es posible crear hilos en una ejecución de Javascript.
Con cada vez páginas más dinámicas, que necesitan realizar pedidos al servidor de manera asincrónica, la cosa se complica. Es necesario crear callbacks continuamente para no paralizar la ejecución del único hilo que tenemos para la página.
Sin embargo, existe una alternativa: la librería Concurrent.Thread para Javascript permite realizar programación multihilos en este entorno. En realidad, simula la creación y ejecución de hilos, pero para el desarrollador es lo mismo. Y en consecuencia, simplifica muchísimo la creación de aplicaciones Javascript.
La nota Presentando programación multihilos para Javascript nos explica con mucho más detalle las ventajas y uso de esta librería.
Como ejemplo, pensemos el siguiente script Javascript:
<script type="text/javascript"> var i = 0; while ( 1 ) { document.body.innerHTML += i + "<br />"; i++; } </script>
Este script empieza a escribir números secuenciales en la página continuamente... y a la vez, la ventana de nuestro browser va a quedar sin respuesta, ya que el único thread de ejecución para esa página fue "colgado" por nuestro script.
Pensemos entonces la misma situación, pero usando Concurrent.Thread:
<script type="text/javascript" src="/Concurrent.Thread.js"></script> <script type="text/javascript"> Concurrent.Thread.create(function(){ var i = 0; while ( 1 ) { document.body.innerHTML += i + "<br />"; i++; } }); </script>
Esta vez, creamos un hilo que realiza la impresión de números. Así, nuestra página sigue respondiendo y pudiendo ejecutar otros scripts. De hecho, podemos lanzar muchos scripts a la vez.
<script type="text/javascript" src="/Concurrent.Thread.js"></script> <script type="text/javascript"> function imprimir ( i ){ while ( 1 ) { document.body.innerHTML += i + "<br />"; i++; } } Concurrent.Thread.create(imprimir, 0); Concurrent.Thread.create(imprimir, 100000); </script>
En este último ejemplo lanzamos dos hilos, los cuales comienzan a numerar desde 0 y desde 100000 cada uno. Nótese que ambos se ejecutan "en paralelo", y además podemos seguir ejecutando otros scripts.
La librería además trae varias utilidades comunes para resolver invocaciones a servidor no bloqueantes, como por ejemplo:
<script type="text/javascript" src="/Concurrent.Thread.js"></script> <script type="text/x-script.multithreaded-js"> var req = Concurrent.Thread.Http.get(url, ["Accept", "*"]); if (req.status == 200) { alert(req.responseText); } else { alert(req.statusText); } </script>
La invocación Concurrent.Thread.Http.get() realiza la invocación a una URL, y devuelve el requerimiento. La llamada es sincrónica (es decir, bloqueante), pero no bloquea al resto de los threads en ejecución. Esto facilita enormemente la comunicación con servidores externos, sin necesidad de crear callbacks u otros trucos.
En resumen, Concurrent.Thread es una librería sumamente útil para la utilización de hilos en Javascript, comunicación con servidores y, en consecuencia, creación de aplicaciones AJAX en general.