# ç®å½
* [Java为ä»ä¹ä¼æå¹¶åé®é¢](#Java为ä»ä¹ä¼æå¹¶åé®é¢)
* [ä»ä¹æ¯CAS](#ä»ä¹æ¯CAS)
* [Unsafe类解读](#Unsafe类解读)
* [JUCååç±»](#JUCååç±»)
* [JUCååç±»ä»ç»](#JUCååç±»ä»ç»)
* [åºç¡ç±»åAtomicInteger](#åºç¡ç±»åAtomicInteger)
* [çº¿ç¨æ± ](#çº¿ç¨æ± )
## Java为ä»ä¹ä¼æå¹¶åé®é¢
> åºç°çåå
å 为Javaæ¯ä¸ç§å¤çº¿ç¨çå¤ç模åãæä»¥å½ä¸ä¸ªè¯·æ±è¿æ¥çæ¶åï¼Javaä¼å°äº§çä¸ä¸ªçº¿ç¨æ¥å¤çè¿ä¸ªè¯·æ±ã妿å¤ä¸ªçº¿ç¨è®¿é®åä¸ä¸ªå
±äº«åéçæ¶åï¼å°±ä¼åºç°å¹¶åé®é¢ãæä»¥ï¼å¹¶åé®é¢äº§ççæ¡ä»¶ä¹ä¸æ¯âå
±äº«åéâãé£ä¹ä»ä¹æ ·çå鿝å
±äº«åéå¢ï¼è¿å°±æ¶åå°Javaå
忍¡åJMMäºï¼Javaå
忍¡åä¸ï¼ä¸ä¸ªJava线ç¨ï¼è¦æ³è·åå°ä¸ä¸ªåéï¼éè¦å
å°åéä»ä¸»å
åæ¾å
¥å·¥ä½å
åï¼ç¶ååéè¿å·¥ä½å
åè·åï¼ç»åä¸ä¸ªlock->read->load->useçè¿ç¨ãæ¯ä¸ä¸ªçº¿ç¨é½æè¿æ ·ä¸ä¸ªè¿ç¨æè½è·åå°åéï¼è¿æ ·èªç¶å°±æå¯è½åºç°A线ç¨è·åå°åéï¼è¿æªèµå¼å主å
åï¼å°±è¢«B线ç¨è¯»åææ´æ¹çåºæ¯ï¼è¿æ ·èªç¶å°±ä¼åºç°ä¸ä¸è´é®é¢ã
> å¹¶åé®é¢åä¸è¬è§£å³æ¹æ¡
* å¯è§æ§é®é¢
Javaå
忍¡åï¼å¦æçº¿ç¨A对åéobjçæ´æ¹è¿æªå®æï¼çº¿ç¨Bå°±è·åå°objçå¼äºï¼è¿æ ·å¯¼è´çæ°æ®ä¸ä¸è´é®é¢å°±å±äºå¯è§æ§é®é¢ãè¦æ³ç¬¦åå¯è§æ§ï¼åå½ä¸ä¸ªçº¿ç¨ä¿®æ¹äºobjçå¼ï¼æ°å¼å¯¹äºå
¶ä»çº¿ç¨æ¥è¯´æ¯å¿
é¡»æ¯å¯ä»¥ç«å³å¯è§çãå¯è§æ§é®é¢å¯ä»¥ä½¿ç¨volatileå
³é®åæ¥è§£å³ãå½ä¸ä¸ªåé被volatile修饰æ¶ï¼å°±ä¸ä¼ä»æ¬å°å·¥ä½å
åä¸è·åäºè¯¥åéçå¼äºãvolatileå®é
䏿¯éè¿å¼ºå¶ä½¿ç¨ä¸»å
åä¸ç弿¥è§£å³å¯è§æ§é®é¢çã
* ååæ§é®é¢
使¯volatile并没æå®å
¨è§£å³å¹¶åé®é¢ï¼å 为ä¸è¿°æä»¬æå设çæä½ï¼é½é»è®¤å½æäºååæä½ãå®é
ä¸ï¼Javaéé¢å¤§éçè¿ç®å¹¶éååæä½ãè¿å°±æ¯ååæ§é®é¢ã
è§£å³ååæ§é®é¢ï¼å¯ä»¥ä½¿ç¨Javaå¹¶åå
䏿ä¾çAtomicç±»ï¼å®çåçæ¯CASä¹è§éãå½ç¶ï¼å¯¹äºå¯è§æ§åååæ§é®é¢ï¼æéé级çè§£å³æ¹æ¡ï¼åæ¶ä¹æ¯ä¸è¬ç¨åºå们æå欢使ç¨çæ¹å¼ï¼å°±æ¯ä½¿ç¨synchronizedè¿è¡å éäºãsynchronizedç使ç¨åå
¶ä»ç¸å
³çå¹¶åé®é¢ã
## ä»ä¹æ¯CAS
> CASç®æ³
CASï¼Compare And Swapï¼å³æ¯è¾å交æ¢ï¼ãjdk5å¢å äºå¹¶åå
java.util.concurrent.*,å
¶ä¸é¢ç类使ç¨CASç®æ³å®ç°äºåºå«äºsynchronouse忥éçä¸ç§ä¹è§éãJDK 5ä¹åJavaè¯è¨æ¯é synchronizedå
³é®åä¿è¯åæ¥çï¼è¿æ¯ä¸ç§ç¬å éï¼ä¹æ¯æ¯æ²è§éã
> 对CASç®æ³ççè§£
对CASççè§£ï¼CASæ¯ä¸ç§æ éç®æ³ï¼CASæ3个æä½æ°ï¼å
åå¼Vï¼æ§ç颿å¼Aï¼è¦ä¿®æ¹çæ°å¼Bãå½ä¸ä»
å½é¢æå¼Aåå
åå¼Vç¸åæ¶ï¼å°å
åå¼Vä¿®æ¹ä¸ºBï¼å¦åä»ä¹é½ä¸åï¼å¹¶è¿åfalseãå¯è½ä¼æé¢è¯å®é® CAS åºå±æ¯å¦ä½å®ç°çï¼å¨JAVAä¸,CASéè¿è°ç¨C++åºå®ç°ï¼ç±C++åºåå»è°ç¨CPUæä»¤éãä¸åä½ç³»ç»æä¸ï¼cpuæä»¤è¿åå¨çææ¾ä¸åãæ¯å¦ï¼x86 CPU æä¾ cmpxchg æä»¤ï¼èå¨ç²¾ç®æä»¤éçä½ç³»æ¶æä¸ï¼ï¼å¦âload and reserveâåâstore conditionalâï¼å®ç°çï¼å¨å¤§å¤æ°å¤çå¨ä¸ CAS 齿¯ä¸ªé常轻é级çæä½ï¼è¿ä¹æ¯å
¶ä¼å¿æå¨ã
CASæ¯è¾ä¸äº¤æ¢ç伪代ç å¯ä»¥è¡¨ç¤ºä¸ºï¼
```java
do{
å¤ä»½æ§æ°æ®ï¼
åºäºæ§æ°æ®æé æ°æ°æ®ï¼
}while(!CAS( å
åå°åï¼å¤ä»½çæ§æ°æ®ï¼æ°æ°æ® ))
```
å设æt1ï¼t2线ç¨åæ¶æ´æ°åä¸åé56çå¼ï¼å 为t1åt2线ç¨é½åæ¶å»è®¿é®åä¸åé56ï¼æä»¥ä»ä»¬ä¼æä¸»å
åçå¼å®å
¨æ·è´ä¸ä»½å°èªå·±çå·¥ä½å
å空é´ï¼æä»¥t1åt2线ç¨ç颿å¼é½ä¸º56ãå设t1å¨ä¸t2线ç¨ç«äºä¸çº¿ç¨t1è½å»æ´æ°åéçå¼ï¼èå
¶ä»çº¿ç¨é½å¤±è´¥ãï¼å¤±è´¥ç线ç¨å¹¶ä¸ä¼è¢«æèµ·ï¼èæ¯è¢«åç¥è¿æ¬¡ç«äºä¸å¤±è´¥ï¼å¹¶å¯ä»¥å次åèµ·å°è¯ï¼ãt1线ç¨å»æ´æ°åé弿¹ä¸º57ï¼ç¶ååå°å
åä¸ãæ¤æ¶å¯¹äºt2æ¥è¯´ï¼å
åå¼å为äº57ï¼ä¸é¢æå¼56ä¸ä¸è´ï¼å°±æä½å¤±è´¥äºï¼æ³æ¹çå¼ä¸åæ¯åæ¥çå¼ï¼ã
å°±æ¯æå½ä¸¤è
è¿è¡æ¯è¾æ¶ï¼å¦æç¸çï¼åè¯æå
±äº«æ°æ®æ²¡æè¢«ä¿®æ¹ï¼æ¿æ¢ææ°å¼ï¼ç¶åç»§ç»å¾ä¸è¿è¡ï¼å¦æä¸ç¸çï¼è¯´æå
±äº«æ°æ®å·²ç»è¢«ä¿®æ¹ï¼æ¾å¼å·²ç»æåçæä½ï¼ç¶åéæ°æ§è¡åæçæä½ã容æçåº CAS æä½æ¯åºäºå
±äº«æ°æ®ä¸ä¼è¢«ä¿®æ¹çå设ï¼éç¨äºç±»ä¼¼äºæ°æ®åºçcommit-retry çæ¨¡å¼ãå½åæ¥å²çªåºç°çæºä¼å¾å°æ¶ï¼è¿ç§å设è½å¸¦æ¥è¾å¤§çæ§è½æåã
> CASç®æ³çä¼ç¼ºç¹
CASï¼æ¯è¾å¹¶äº¤æ¢ï¼æ¯`CPUæä»¤çº§`çæä½ï¼åªæä¸æ¥ååæä½ï¼æä»¥é常快ãèä¸CASé¿å
äºè¯·æ±æä½ç³»ç»æ¥è£å®éçé®é¢ï¼ä¸ç¨éº»ç¦æä½ç³»ç»ï¼ç´æ¥å¨CPUå
é¨å°±æå®äºãä½CAS就没æå¼éäºåï¼ä¸ï¼æcache missçæ
åµãä¸ä¸ª8æ ¸CPUè®¡ç®æºç³»ç»ï¼æ¯ä¸ªCPUæcacheï¼CPUå
é¨çé«éç¼åï¼å¯åå¨ï¼ï¼ç®¡è¯å
è¿å¸¦æä¸ä¸ªäºè模åï¼ä½¿ç®¡è¯å
çä¸¤ä¸ªæ ¸å¯ä»¥äºç¸éä¿¡ãå¨å¾ä¸å¤®çç³»ç»äºè模åå¯ä»¥è®©å个管è¯ç¸äºéä¿¡ï¼å¹¶ä¸å°ç®¡è¯ä¸ä¸»åè¿æ¥èµ·æ¥ãæ°æ®ä»¥âç¼å线â为åä½å¨ç³»ç»ä¸ä¼ è¾ï¼âç¼å线â对åºäºå
åä¸ä¸ä¸ª 2 çå¹å¤§å°çåèåï¼å¤§å°é常为 32 å° 256 åèä¹é´ãå½ CPU ä»å
åä¸è¯»åä¸ä¸ªåéå°å®çå¯åå¨ä¸æ¶ï¼å¿
é¡»é¦å
å°å
å«äºè¯¥åéçç¼å线读åå° CPU é«éç¼åãåæ ·å°ï¼CPU å°å¯åå¨ä¸çä¸ä¸ªå¼åå¨å°å
åæ¶ï¼ä¸ä»
å¿
é¡»å°å
å«äºè¯¥å¼çç¼åçº¿è¯»å° CPU é«éç¼åï¼è¿å¿
é¡»ç¡®ä¿æ²¡æå
¶ä» CPU æ¥æè¯¥ç¼åçº¿çæ·è´ãå·æ°ä¸åCPUç¼åçå¼éï¼å æ¤ä¹å°±æ¯è¯´CASæå¼éãéæä½æ¯ CAS æä½æ´å èæ¶ï¼æ¯å 为éæä½çæ°æ®ç»æä¸éè¦ä¸¤ä¸ªååæä½ï¼lock+updateï¼ã

* CASçç¼ºç¹æä»¥ä¸å 个æ¹é¢ï¼
* ABAé®é¢
妿æä¸ªçº¿ç¨å¨CASæä½æ¶åç°ï¼å
åå¼å颿å¼é½æ¯Aï¼å°±è½ç¡®å®æé´æ²¡æçº¿ç¨å¯¹å¼è¿è¡ä¿®æ¹åï¼çæ¡æªå¿
ï¼å¦ææé´åçäº A -> B -> A çæ´æ°ï¼ä»
ä»
夿æ°å¼æ¯ Aï¼å¯è½å¯¼è´ä¸åççä¿®æ¹æä½ãé对è¿ç§æ
åµï¼Java æä¾äº AtomicStampedReference å·¥å
·ç±»ï¼éè¿ä¸ºå¼ç¨å»ºç«ç±»ä¼¼çæ¬å·ï¼stampï¼çæ¹å¼ï¼æ¥ä¿è¯ CAS çæ£ç¡®æ§ã
* å¾ªç¯æ¶é´é¿å¼é大
CASä¸ä½¿ç¨ç失败éè¯æºå¶ï¼éèçä¸ä¸ªå设ï¼å³ç«äºæ
嵿¯çæçã大夿°åºç¨åºæ¯ä¸ï¼ç¡®å®å¤§é¨åéè¯åªä¼åç䏿¬¡å°±è·å¾äºæåã使¯æ»ææå¤æ
åµï¼æä»¥å¨æéè¦çæ¶åï¼è¿æ¯è¦èèéå¶èªæç次æ°ï¼ä»¥å
è¿åº¦æ¶è CPUã
* åªè½ä¿è¯ä¸ä¸ªå
±äº«åéçååæä½
## Unsafe类解读
* Unsafeç±»æ¯å¨sun.miscå
ä¸ï¼ä¸å±äºJavaæ åã该类å°è£
äºè®¸å¤ç±»ä¼¼æéæä½ï¼å¯ä»¥ç´æ¥è¿è¡å
å管çãæçºµå¯¹è±¡ãé»å¡/å¤é线ç¨çæä½ãJavaæ¬èº«ä¸ç´æ¥æ¯ææéçæä½ï¼æä»¥è¿ä¹æ¯è¯¥ç±»å½å为Unsafeçåå ä¹ä¸ã使¯å¾å¤Javaçåºç¡ç±»åºï¼å
æ¬ä¸äºè¢«å¹¿æ³ä½¿ç¨ç髿§è½å¼ååºé½æ¯åºäºUnsafeç±»å¼åçï¼æ¯å¦NettyãHadoopãKafkaçã
* 使ç¨Unsafeå¯ç¨æ¥ç´æ¥è®¿é®ç³»ç»å
åèµæºå¹¶è¿è¡èªä¸»ç®¡çï¼Unsafeç±»å¨æåJavaè¿è¡æçï¼å¢å¼ºJavaè¯è¨åºå±æä½è½åæ¹é¢èµ·äºå¾å¤§çä½ç¨ã
* Unsafeå¯è®¤ä¸ºæ¯Javaä¸çä¸çåé¨ï¼æä¾äºä¸äºä½å±æ¬¡æä½ï¼å¦ç´æ¥å
å访é®ã线ç¨è°åº¦çã
* 宿¹å¹¶ä¸å»ºè®®ä½¿ç¨Unsafeã
J.U.Cä¸ç许å¤CASæ¹æ³ï¼å
é¨å
¶å®é½æ¯Unsafeç±»å¨æä½ã
æ¯å¦AtomicBooleançcompareAndSetæ¹æ³ï¼
```java
public final boolean compareAndSet(boolean expect, boolean update) {
int e = expect ? 1 : 0;
int u = update ? 1 : 0;
return unsafe.compareAndSwapInt(this, valueOffset, e, u);
}
compareAndSwapInt(Object o, long offset, int expected, int x);
// oæ¯éè¦ä¿®æ¹ç对象 offsetéè¦ä¿®æ¹çåæ®µå°å¯¹è±¡å¤´çåç§»éï¼éè¿åç§»éå¯ä»¥å¿«éå®ä½ä¿®æ¹çæ¯åªä¸ªåæ®µï¼ expected ææå¼ xè¦è®¾ç½®çå¼
```
unsafe.compareAndSwapIntæ¹æ³æ¯ä¸ªnativeæ¹æ³ãï¼å¦æå¯¹è±¡ä¸çåæ®µå¼ä¸ææå¼ç¸çï¼åå°å段å¼ä¿®æ¹ä¸ºxï¼ç¶åè¿åtrueï¼å¦åè¿åfalse)ï¼
> Unsafeç大é¨åAPI齿¯nativeçæ¹æ³ï¼ä¸»è¦å
æ¬ä»¥ä¸å ç±»ï¼
1. Classç¸å
³ãä¸»è¦æä¾Classåå®çéæå段çæä½æ¹æ³ã
2. Objectç¸å
³ãä¸»è¦æä¾Objectåå®çåæ®µçæä½æ¹æ³ã
3. Arrrayç¸å
³ãä¸»è¦æä¾æ°ç»åå
¶ä¸å
ç´ çæä½æ¹æ³ã
4. å¹¶åç¸å
³ãä¸»è¦æä¾ä½çº§å«åæ¥åè¯ï¼å¦CASã线ç¨è°åº¦ãvolatileãå
åå±éçã
5. Memoryç¸å
³ãæä¾äºç´æ¥å
åè®¿é®æ¹æ³ï¼ç»è¿Javaå ç´æ¥æä½æ¬å°å
åï¼ï¼å¯åå°åC䏿 ·èªç±å©ç¨ç³»ç»å
åèµæºã
6. ç³»ç»ç¸å
³ã主è¦è¿åæäºä½çº§å«çå
åä¿¡æ¯ï¼å¦å°å大å°ãå
å页大å°ã
## JUCååç±»
### JUCååç±»ä»ç»
æ ¹æ®ä¿®æ¹çæ°æ®ç±»åï¼å¯ä»¥å°JUCå
ä¸çååæä½ç±»å¯ä»¥å为4ç±»ã
1. åºæ¬ç±»å: AtomicInteger, AtomicLong, AtomicBoolean ;
2. æ°ç»ç±»å: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ;
3. å¼ç¨ç±»å: AtomicReference, AtomicStampedRerence, AtomicMarkableReference ;
4. 对象ç屿§ä¿®æ¹ç±»å: AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater ã
è¿äºç±»åå¨çç®çæ¯å¯¹ç¸åºçæ°æ®è¿è¡ååæä½ãæè°ååæä½ï¼æ¯ææä½è¿ç¨ä¸ä¼è¢«ä¸æï¼ä¿è¯æ°æ®æä½æ¯ä»¥ååæ¹å¼è¿è¡çã
#### åºç¡ç±»åAtomicInteger
> åç解读ï¼ä»¥AtomicInteger为ä¾ï¼
AtomicIntegerä½äºjava.util.concurrent.atomicå
ä¸ï¼æ¯å¯¹intçå°è£
ï¼æä¾ååæ§ç访é®åæ´æ°æä½ï¼å
¶ååæ§æä½çå®ç°æ¯åºäºCASã
* CASæä½
* value使ç¨äºvolatile修饰
* AtomicIntegeråçæµ
æ
```java
public class AtomicInteger extends Number implements java.io.Serializable {
private static final long serialVersionUID = 6214790243416807050L;
// setup to use Unsafe.compareAndSwapInt for updates
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
// volatileå
³é®å修饰
private volatile int value;
}
```
ä» AtomicInteger çå
é¨å±æ§å¯ä»¥çåºï¼å®ä¾èµäºUnsafe æä¾çä¸äºåºå±è½å(CASæä½ï¼éè¿å
ååç§»å°åä¿®æ¹åéå¼)ï¼è¿è¡åºå±æä½ï¼å¦æ ¹æ®valueOffset代表ç该åéå¼å¨å
åä¸çåç§»å°åï¼ä»èè·åæ°æ®çã
åévalueç¨volatile修饰ï¼ä¿è¯äºå¤çº¿ç¨ä¹é´çå
åå¯è§æ§ã
ä¸é¢ä»¥getAndIncrement为ä¾ï¼è¯´æå
¶ååæä½è¿ç¨
```java
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
//unsafe.getAndAddInt
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}
```
å设线ç¨1å线ç¨2éè¿getIntVolatileæ¿å°valueçå¼é½ä¸º1ï¼çº¿ç¨1被æèµ·ï¼çº¿ç¨2ç»§ç»æ§è¡
线ç¨2å¨compareAndSwapIntæä½ä¸ç±äºé¢æå¼åå
åå¼é½ä¸º1ï¼å æ¤æåå°å
å弿´æ°ä¸º2
线ç¨1ç»§ç»æ§è¡ï¼å¨compareAndSwapIntæä½ä¸ï¼é¢æå¼æ¯1ï¼èå½åçå
åå¼ä¸º2ï¼CASæä½å¤±è´¥ï¼ä»ä¹é½ä¸åï¼è¿åfalse
线ç¨1éæ°éè¿getIntVolatileæ¿å°ææ°çvalue为2ï¼åè¿è¡ä¸æ¬¡compareAndSwapIntæä½ï¼è¿æ¬¡æä½æåï¼å
å弿´æ°ä¸º3
> å
¶ä»
AtomicLongæ¯ä½ç¨æ¯å¯¹é¿æ´å½¢è¿è¡ååæä½ãå¨32使ä½ç³»ç»ä¸ï¼64ä½çlong å double åéç±äºä¼è¢«JVMå½ä½ä¸¤ä¸ªå离ç32使¥è¿è¡æä½ï¼æä»¥ä¸å
·æååæ§ãè使ç¨AtomicLongè½è®©longçæä½ä¿æåååã
#### æ°ç»ç±»å
AtomicIntegerArray, AtomicLongArray, AtomicReferenceArrayä¸ä¸ªæ°ç»ç±»åçååç±»ï¼åçåç¨æ³é½æ¯ç±»ä¼¼çã
è¿ä¸ç§ç±»å大åå°å¼ï¼AtomicIntegerArray对åºAtomicIntegerï¼AtomicLongArray对åºAtomicLongï¼AtomicReferenceArray对åºAtomicReferenceã
AtomicLongæ¯ä½ç¨æ¯å¯¹é¿æ´å½¢è¿è¡ååæä½ãèAtomicLongArrayçä½ç¨åæ¯å¯¹"é¿æ´å½¢æ°ç»"è¿è¡ååæä½ã
unsafeæ¯éè¿Unsafe.getUnsafe()è¿åçä¸ä¸ªUnsafe对象ãéè¿UnsafeçCAS彿°å¯¹longåæ°ç»çå
ç´ è¿è¡ååæä½ã
å
¶å®é
读æºç ä¹å¯ä»¥åç°ï¼è¿äºæ°ç»ååç±»ä¸å¯¹åºçæ®éååç±»ç¸æ¯ï¼åªæ¯å¤äºéè¿ç´¢å¼æ¾å°å
åä¸å
ç´ å°åçæä½èå·²ã
注æï¼ååæ°ç»å¹¶ä¸æ¯è¯´å¯ä»¥è®©çº¿ç¨ä»¥ååæ¹å¼ä¸æ¬¡æ§å°æä½æ°ç»ä¸ææå
ç´ çæ°ç»ãèæ¯æå¯¹äºæ°ç»ä¸çæ¯ä¸ªå
ç´ ï¼å¯ä»¥ä»¥ååæ¹å¼è¿è¡æä½ã
## çº¿ç¨æ±
java.util.concurrentå
æä¾äºç°æççº¿ç¨æ± çå®ç°


å¤§æ¦æ¥éª¤ä¸ºä»¥ä¸3æ¥ï¼
1. è°ç¨æ§è¡å¨ç±»ï¼Executorsï¼çéææ¹æ³æ¥åå»ºçº¿ç¨æ±
2. è°ç¨çº¿ç¨æ± çsubmitæ¹æ³æäº¤RunnableæCallable对象
3. å½ä¸éè¦æ·»å æ´å¤ç任塿¶ï¼è°ç¨shutdownå
³éå
¥å£
```java
//åå»ºçº¿ç¨æ± 对象
ExecutorService service = Executors.newCachedThreadPool();
//å建ä¸ä¸ªç¨äºéå¢è¾åºiå¼çrunnable对象
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 400; i++) {
System.out.println(i);
}
}
};
//è°ç¨çº¿ç¨æ± çsubmitæ¹æ³ä¼ å
¥runnable(ä¼ å
¥çrunnableå°ä¼èªå¨æ§è¡)
service.submit(runnable);
service.submit(runnable);
//å½ä¸éè¦ä¼ å
¥æ´å¤ç任塿¶è°ç¨shutdownæ¹æ³æ¥å
³éå
¥å£
service.shutdown();
```
éè¦æ³¨æçæ¯å¦æå¸æç´æ¥åæ¢çº¿ç¨æ± çä¸å任塿¯æ æ³éè¿shutdownæ¥æä½çï¼å 为shutdownä»
ä»
æ¯å
³éäºå
¥å£ï¼ä½æ¯å·²ç»å å
¥çä»»å¡è¿æ¯ä¼ç»§ç»æ§è¡çï¼è¿æ¶æä»¬å¯ä»¥è°ç¨çº¿ç¨æ± çshutdownNowæ¹æ³æ¥æä½ï¼shutdownNowçä½ç¨æ¯ç¨æ¥å
³éçº¿ç¨æ± çå
¥å£å¹¶ä¸ä¼å°è¯ç»æ¢ææå½åçº¿ç¨æ± å
çä»»å¡ã
```java
//ç¨æ¥å
³éçº¿ç¨æ± å
¥å£ä»¥åç»æ¢æææ£å¨æ§è¡çä»»å¡
service.shutdownNow();
```
serviceçsubmitæ¹æ³ä¼è¿åä¸ä¸ªFuture>ç±»åç对象ç¶èè¿æ¯ä¸ä¸ªææ ·çç±»åå¢ï¼è®©æä»¬æ¥çä¸ä¸apiä¸çæ¹æ³æè¦ï¼

仿¹æ³æè¦ä¸å¯ä»¥çåºè¯¥å¯¹è±¡ç¨äºå¨å å
¥çº¿ç¨æ± 以åè½å¤å¯¹æ¤ä»»å¡è¿è¡åæ¶ï¼æ¥çç¶æçæä½ï¼å¦æè¯´å¨å å
¥çº¿ç¨æ± 以åæå¯è½ä¼åæ¶æ¤ä»»å¡çè¯å°±éè¦ï¼å¨submitçæ¶åå°±éè¦ä¿å好Future对象ã
> 为ä»ä¹è¦ç¨çº¿ç¨æ± :
* æ± åææ¯åºç¨ï¼çº¿ç¨æ± ãæ°æ®åºè¿æ¥æ± ãhttpè¿æ¥æ± ççã
* æ± åææ¯çææ³ä¸»è¦æ¯ä¸ºäºåå°æ¯æ¬¡è·åèµæºçæ¶èï¼æé«å¯¹èµæºçå©ç¨çã
* çº¿ç¨æ± æä¾äºä¸ç§éå¶ã管çèµæºççç¥ã æ¯ä¸ªçº¿ç¨æ± è¿ç»´æ¤ä¸äºåºæ¬ç»è®¡ä¿¡æ¯ï¼ä¾å¦å·²å®æä»»å¡çæ°éã
使ç¨çº¿ç¨æ± ç好å¤ï¼
* `éä½èµæºæ¶è`ï¼éè¿éå¤å©ç¨å·²å建ç线ç¨éä½çº¿ç¨å建åéæ¯é æçæ¶èã
* `æé«ååºé度`ï¼å½ä»»å¡å°è¾¾æ¶ï¼å¯ä»¥ä¸éè¦çå¾
线ç¨å建就è½ç«å³æ§è¡ã
* `æé«çº¿ç¨çå¯ç®¡çæ§`ï¼çº¿ç¨æ¯ç¨ç¼ºèµæºï¼å¦ææ éå¶çå建ï¼ä¸ä»
伿¶èç³»ç»èµæºï¼è¿ä¼éä½ç³»ç»çç¨³å®æ§ï¼ä½¿ç¨çº¿ç¨æ± å¯ä»¥è¿è¡ç»ä¸çåé
ï¼çæ§åè°ä¼ã
Javaéé¢çº¿ç¨æ± ç顶级æ¥å£æ¯Executorï¼ä½æ¯ä¸¥æ ¼æä¹ä¸è®²Executor并䏿¯ä¸ä¸ªçº¿ç¨æ± ï¼èåªæ¯ä¸ä¸ªæ§è¡çº¿ç¨çå·¥å
·ãçæ£ççº¿ç¨æ± æ¥å£æ¯ExecutorServiceã

* 主线ç¨é¦å
è¦å建å®ç°RunnableæCallableæ¥å£çä»»å¡å¯¹è±¡ã
* æåå»ºå®æçå®ç°Runnable/Callableæ¥å£çå¯¹è±¡ç´æ¥äº¤ç»ExecutorServiceæ§è¡ï¼
* ExecutorService.execute(Runnable command)æè
ExecutorService.sumbit(Runnable command)æExecutorService.sumbit(Callable