¿Por qué los futuros de Clojure cancelados siguen utilizando la CPU?

Tengo muchos ejemplos de código de bytes de Java, todos los cuales me gustaría ejecutar desde Clojure. Cada secuencia de bytecode puede contener un bucle infinito, en cuyo caso me gustaría dejar de ejecutarlo después de un par de segundos. He estado viendo el futuro como un medio para hacer esto. Habiendo buscado un par de implementaciones, he probado este código:

(deref (future (loop[a 1] (recur a)) :done!) 1000 :impatient!)

... y también el código enhttps://gist.github.com/3124000

En ambos casos, parece que el tiempo de espera del bucle es el adecuado (y en este último caso, se informa que el futuro ya se realizó y se canceló), pero veo que mi uso de CPU aumenta al 99% o aproximadamente y permanece allí. También veo que cada vez que ejecuto este código, mi proceso Java gana un hilo adicional.

Me parece que el futuro se está cancelando, pero el código aún se está ejecutando. En mi programa, tendré que ejecutar, y expirar, algunos bucles infinitos muy ajustados (por ejemplo, el bytecode Java equivalente a "20 PRINT GOTO 10") y no tengo la opción de modificar el código que estoy ejecutando.

Cualquier idea de por qué estoy viendo este comportamiento; qué podría hacer para evitarlo; ¿O métodos alternativos para que me diera cuenta de mi objetivo de ejecutar y caducar ese código?

Respuestas a la pregunta(3)

Su respuesta a la pregunta