On Dec 26, 11:42 pm, Alex Osborne <a...@meshy.org> wrote:
> justinhj <justi...@gmail.com> writes:
> > I tried passing *out* to my thread function and then binding it to
> > *out* in the thread, and this works but then makes the threads execute
> > one at a time, and I'm presuming that is because my use of *out* in
> > the binding block is blocking for the other threads which use it.
>
> That doesn't sound right: binding itself never blocks.  Can you post
> some example code where you see this behaviour?
>
> As I understand it binding conveyance should happen automatically in the
> upcoming 1.3 release (for futures and agents) but in 1.2 you can use
> bound-fn, or for better performance use binding explicitly as you
> suggested.
>
>     (future-call (bound-fn [] (println "log...")))
>
>     (send some-agent (bound-fn [x] (println "log...") (inc x)))

This is the code I've written so far

(defn sleeper-thread [out id t]
  "Sleep for time T ms"
  (binding [*out* out]
    (printf "%d sleeping for time %d\n" id t)
    (Thread/sleep t)
    (printf "%d slept\n" id)))

(defn test-threads [n out]
  (dotimes [x n]
    (.start (Thread. (#(sleeper-thread %1 %2 %3) out x (+ 2000 (rand-
int 5000)))))))

And the output is

0 sleeping for time 5480
0 slept
1 sleeping for time 6739
1 slept
2 sleeping for time 5444
2 slept
3 sleeping for time 3087
3 slept
4 sleeping for time 6753
4 slept
5 sleeping for time 3489
5 slept
6 sleeping for time 5864
6 slept
7 sleeping for time 5523
7 slept
8 sleeping for time 5659
8 slept
9 sleeping for time 5052
9 slept

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to