Un esempio di come è possibile, con le nuove feature di HTML 5, gestire più thread in un processo separato tramite i Worker.
Allo stato attuale funziona su Internet Explore 10 e sulle ultime versioni di Firefox, Chrome, Opera e Safari
Nell'esempio propongo un contatore che si incrementa ogni 100 ms e può essere avviato, messo in pausa o fermato. Il conteggio è gestito in un thread separato contenuto nel file worker1.js. E' in un file separato perchè l'oggetto worker vuole un file .js separato dalla pagina che lo esegue. La comunicazione tra la pagina principale e il thread avviene tramite messaggi ed eventi (postMessage e onmessage).

Per creare un Worker la procedura è questa:
  • si crea l'oggetto Worker passandogli il nome del file (new Worker(this.fileName))
  • si aggancia un evento per gestire i messaggi inviati dal thread (this.worker.onmessage)
  • nel codice del worker si crea il codice da eseguire (workerExecute)
  • se necessario, tramite setTimeout lo si esegue all'infinito
  • si gestisce l'evento onmessage per permettere alla pagina di inviare messaggi al Worker
Attenzione, alcuni browser, per impostazioni di sicurezza, bloccano l'esecuzione dei Worker se eseguiti da un persorso locale file://. Conviene sempre eseguirli tramite un webserver su protocollo http o https

File: default.html
<html>
<head>
  <title>HTML 5 Worker - Sgart.it</title>
</head>
<body>

<h1>HTML 5 Worker - Sgart.it</h1>
<div>
  Result: <span id="result">0</span>
  <div>
    <input type="button" value="start" onclick="sgart.worker.start()" />
    <input type="button" value="pause" onclick="sgart.worker.pause()" />
    <input type="button" value="stop" onclick="sgart.worker.stop()" />
  </div>
</div>


<script type="text/javascript">
var sgart =  sgart || {};
sgart.worker = {
  worker: null,
  fileName: "worker1.js",
  id: "result",
  start: function(){
    if(typeof(Worker) === "undefined") {
      document.getElementById(this.id).innerHTML = "Worker not supported - upgrade your browser";
    } else {
      var tmpID = this.id;
      // il worker deve essere in un file separato
      if(this.worker === null) {
        this.worker = new Worker(this.fileName);
        this.worker.onmessage = function(ev){
          var msg = ev.data;
          document.getElementById(tmpID).innerHTML = msg.counter + " ( " + msg.name + " ) ";
        };
      } else {
        this.worker.postMessage("start");
      }
    }
  },
  pause: function(){
    if(this.worker !== null) {
      //invio un messaggio al worker
      this.worker.postMessage("pause");
    }
  },	
  stop: function(){
    if(this.worker !== null) {
      this.worker.terminate();
      this.worker = null;
      document.getElementById(this.id).innerHTML = "stop";
    }
  }
}
</script>

</body>
</html>

File: worker1.js
var i = 0;
var pause = false;
//da qui non posso accedere al DOM
function workerExecute()
{
  //costruisco l'oggetto da passare come messaggio 
  //( posso usare anche valori semplici es: postMessage(i) )
  var msg = {counter: ++i, name: "workerExecute"};
  postMessage(msg);
  //rieseguo la routine
  if(pause === true)
    pause = false;
  else
    setTimeout("workerExecute()", 100);
}

onmessage = function (ev) {
  if(ev.data === "pause"){
    pause = true;
  }else if(ev.data === "start"){
    pause = false;
    workerExecute();
  }
  /*if(ev.data === "close"){
    var msg = {counter: 0, name: "close"};
    postMessage(msg);
    self.close();
  }*/ 
};
//eseguo il metodo quando viene istanziato
workerExecute(); 

Vedi anche W3C Web Workers