### Agents
Agents 是用把一些事情放到另外一個線程來做 -- 一般來說不需要事務控制的。它們對于修改一個單個對象的值(也就是Agent的值)來說很方便。這個值是通過在另外的一個thread上面運行一個“action”來修改的。一個action是一個函數, 這個函數接受Agent的當前值以及一些其它參數。 Only one action at a time will be run on a given Agent在任意一個時間點一個Agent實例上面只能運行一個action.
`agent` 函數可以建立一個新的Agent. 比如:
```
(def my-agent (agent <em>initial-value</em>))
```
`send` 函數把一個 action 分配給一個 Agent, 并且馬上返回而不做任何等待。 這個action會在另外一個線程(一般是由一個線程池提供的)上面單獨運行。 當這個action運行結束之后,返回值會被設置給這個Agent。 `send-off` 函數也類似只是線程來自另外一個線程吃。
`send` 使用一個 "固定大小的" 線程吃 (java.util.concurrent.Executors里面的 [newFixedThreadPool](http://java.sun.com/javase/6/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int)) ) , 線程的個數是機器的處理器的個數加2。如果所有的線程都被占用,那么你如果要運行新的action, 那你就要等了。 `send-off` 使用的是 "cached thread pool" (java.util.concurrent.Executors里面的? [newCachedThreadPool](http://java.sun.com/javase/6/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool()) ) , 這個線程池里面的線程的個數是按照需要來分配的。
如果 `send` 或者 `send-off` 函數是在一個事務里面被調用的。 那么這個action直到線程提交的時候才會被發送給另外一個線程去執行。這在某種程度上來說和 `commute` 函數對 Ref 的作用是類似的。
在action里面, 相關聯的那個agent可以通過symbol: `*agent*` 得到。
`await` 以一個或者多個Agent作為參數, 并且block住當前的線程,直到當前線程分派給這些Agent的action都執行完了。 `await-for` 函數是類似的, 但是它接受一個超時時間作為它的第一個參數, 如果在超時之前事情都做完了, 那么返回一個非nil的值, 否則返回一個非nil的值,而且當前線程也就不再被block了。 `await` 和 `await-for` 函數不能在事務里面調用。
如果一個action執行的時候拋出一個異常了,那么你要dereference這個Agent的話也會拋出異常的。在action里面拋出的所有的異常可以通過 `agent-errors` 函數獲取。 `clear-agent-errors` 函數可以清除一個指定Agent上面的所有異常。
`shutdown-agents` 函數等待所有發送給agents的action都執行完畢。然后它停止線程池里面所有的線程。在這之后你就不能發送新的action了。我們一定要調用 `shutdown-agents` 以讓JVM 可以正常退出,因為Agent使用的這些線程不是守護線程, 如果你不顯式關閉的話,JVM是不會退出的。