ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>国产乱码精品一区二区三区亚洲人 ,一本大道久久a久久综合,超碰在线公开超碰在线http://www.aygfsteel.com/stevenjohn/category/54681.html那些青春的岁æœ?/description>zh-cnTue, 14 Jun 2016 14:05:19 GMTTue, 14 Jun 2016 14:05:19 GMT60èŠèŠé«˜åÆˆå‘ç³»¾lŸä¹‹é™æµç‰ÒŽ(gu¨©)Š€-1http://www.aygfsteel.com/stevenjohn/archive/2016/06/14/430882.htmlabinabinTue, 14 Jun 2016 05:38:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2016/06/14/430882.htmlhttp://www.aygfsteel.com/stevenjohn/comments/430882.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2016/06/14/430882.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/430882.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/430882.html阅读全文

]]>
关于单CPUåQŒå¤šCPU上的原子操作http://www.aygfsteel.com/stevenjohn/archive/2015/04/20/424546.htmlabinabinMon, 20 Apr 2015 06:02:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/04/20/424546.htmlhttp://www.aygfsteel.com/stevenjohn/comments/424546.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/04/20/424546.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/424546.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/424546.html所谓原子操ä½?ž®±æ˜¯"不可中断的一个或一¾pÕdˆ—操作" ã€?/span>

¼‹¬äšg¾U§çš„原子操作åQ?/span>
在单处理器系¾l?UniProcessor)ä¸­ï¼Œèƒ½å¤Ÿåœ¨å•æ¡æŒ‡ä»¤ä¸­å®Œæˆçš„æ“ä½œéƒ½å¯ä»¥è®¤äØ“(f¨´)æ˜? 原子操作"åQŒå› ä¸ÞZ¸­æ–­åªèƒ½å‘生于指ä×o(h¨´)之间。这也是某些CPU指ä×o(h¨´)¾pȝ»Ÿä¸­å¼•入了(ji¨£n)test_and_set、test_and_clear½{‰æŒ‡ä»¤ç”¨äºŽäÍ(f¨´)界资源互斥的原因ã€?/span>

在对¿U°å¤šå¤„理å™?Symmetric Multi-Processor)¾l“构中就不同äº?ji¨£n),ç”׃ºŽ¾pȝ»Ÿä¸­æœ‰å¤šä¸ªå¤„理器在独立地运行,即ä‹É能在单条指ä×o(h¨´)中完成的操作也有可能受到òq²æ‰°ã€?/span>

在x86 òq›_°ä¸Šï¼ŒCPU提供äº?ji¨£n)在指ä×o(h¨´)执行期间å¯ÒŽ(gu¨©)€Èº¿åŠ é”çš„æ‰‹ŒDüc(di¨£n)€‚CPU芯片上有一条引¾U?HLOCK pinåQŒå¦‚果汇¾~–语­a€çš„程序中在一条指令前面加上前¾~€"LOCK"åQŒç»˜q‡æ±‡¾~–以后的机器代码ž®×ƒ‹ÉCPU在执行这条指令的时候把#HLOCK pin的电(sh¨´)位拉低,持箋到这条指令结束时攑ּ€åQŒä»Žè€ŒæŠŠæ€Èº¿é”ä½åQŒè¿™æ ·åŒä¸€æ€Èº¿ä¸Šåˆ«çš„CPUž®±æš‚时不能通过æ€Èº¿è®‰K—®å†…å­˜äº?ji¨£n),保证了(ji¨£n)这条指令在多处理器环境中çš?/span>

原子性�/span>
软äšg¾U§çš„原子操作åQ?/span>
软äšg¾U§çš„原子操作实现依赖于硬件原子操作的支持ã€?/span>
对于linux而言åQŒå†…核提供了(ji¨£n)两组原子操作接口åQšä¸€¾l„是针对整数˜q›è¡Œæ“ä½œåQ›å¦ä¸€¾l„是针对单独的位˜q›è¡Œæ“ä½œã€?/span>
2.1. 原子整数操作
针对整数的原子操作只能对atomic_t¾cÕdž‹çš„æ•°æ®å¤„理。这里没有ä‹É用C语言的int¾cÕdž‹åQŒä¸»è¦æ˜¯å› äØ“(f¨´)åQ?/span>

1) 让原子函数只接受atomic_t¾cÕdž‹æ“ä½œæ•ŽÍ¼Œå¯ä»¥¼‹®ä¿åŽŸå­æ“ä½œåªä¸Ž˜q™ç§ç‰ÒŽ(gu¨©)®Š¾cÕdž‹æ•°æ®ä¸€èµ·ä‹Éç”?/span>

2) 使用atomic_t¾cÕdž‹¼‹®ä¿¾~–è¯‘å™¨ä¸å¯¹ç›¸åº”çš„å€ÆD¿›è¡Œè®¿é—®ä¼˜åŒ?/span>

3) 使用atomic_t¾cÕdž‹å¯ä»¥å±è”½ä¸åŒä½“ç³»¾l“构上的数据¾cÕdž‹çš„差异。尽½Ž¡Linux支持的所有机器上的整型数据都æ˜?2位,但是使用atomic_t的代码只能将该类型的数据当作24ä½æ¥ä½¿ç”¨ã€‚è¿™ä¸ªé™åˆ¶å®Œå…¨æ˜¯å› äØ“(f¨´)在SPARC体系¾l“构上,原子操作的实çŽîC¸åŒäºŽå…¶å®ƒä½“ç³»¾l“æž„åQ?2位int¾cÕdž‹çš„低8位嵌入了(ji¨£n)一个锁åQŒå› ä¸ºSPARC体系¾l“构对原子操作缺乏指令çñ”的支持,所以只能利用该锁来避免对原子类型数据的òq¶å‘讉K—®ã€?/span>

原子整数操作最常见的用途就是实现计数器。原子整数操作列表在中定义。原子操作通常是内敛函敎ͼŒå¾€å¾€é€šè¿‡å†…嵌汇编指ä×o(h¨´)来实现。如果某个函数本来就是原子的åQŒé‚£ä¹ˆå®ƒå¾€å¾€ä¼?x¨¬)被定义成一个宏ã€?/span>

在编写内核时åQŒæ“ä½œä¹Ÿ½Ž€å•:(x¨¬)

atomic_t use_cnt;

atomic_set(&use_cnt, 2);

atomic_add(4, &use_cnt);

atomic_inc(use_cnt);

2.2. 原子性与™åºåºæ€?/span>

原子性确保指令执行期间不被打断,要么全部执行åQŒè¦ä¹ˆæ ¹æœ¬ä¸æ‰§è¡Œã€‚而顺序性确保即使两条或多条指ä×o(h¨´)出现在独立的执行¾U¿ç¨‹ä¸­ï¼Œç”šè‡³ç‹¬ç«‹çš„处理器上,它们本该执行的顺序依然要保持ã€?/span>

2.3. 原子位操�/span>

原子位操作定义在文äšg中。ä×o(h¨´)人感到奇怪的是位操作函数是对普通的内存地址˜q›è¡Œæ“ä½œçš„。原子位操作在多数情况下是对一个字长的内存讉K—®åQŒå› è€Œä½å¯‚¯¥ä½äºŽ0-31之间(åœ?4位机器上æ˜?-63之间),但是对位åïL(f¨¥ng)š„范围没有限制ã€?/span>

¾~–写内核代码åQŒåªè¦æŠŠæŒ‡å‘äº?ji¨£n)你希望的数据的指针¾l™æ“ä½œå‡½æ•ŽÍ¼Œž®±å¯ä»¥è¿›è¡Œä½æ“ä½œäº?ji¨£n)ï¼?x¨¬)

unsigned long word = 0;

set_bit(0, &word); /*½W?位被讄¡½®*/

set_bit(1, &word); /*½W?位被讄¡½®*/

clear_bit(1, &word); /*½W?位被清空*/

change_bit(0, &word); /*¾˜»è{½W?ä½?/

ä¸ÞZ»€ä¹ˆå…³æ³¨åŽŸå­æ“ä½œï¼Ÿ
1åQ‰åœ¨¼‹®è®¤ä¸€ä¸ªæ“ä½œæ˜¯åŽŸå­çš„æƒ…å†µä¸‹åQŒå¤š¾U¿ç¨‹çŽ¯å¢ƒé‡Œé¢åQŒæˆ‘ä»¬å¯ä»¥é¿å…ä»…ä»…äØ“(f¨´)保护˜q™ä¸ªæ“ä½œåœ¨å¤–围加上性能开销昂贵的锁ã€?/span>
2åQ‰å€ŸåŠ©äºŽåŽŸå­æ“ä½œï¼Œæˆ‘ä»¬å¯ä»¥å®žçŽ°äº’æ–¥é”ã€?/span>
3åQ‰å€ŸåŠ©äºŽäº’æ–¥é”åQŒæˆ‘ä»¬å¯ä»¥æŠŠä¸€äº›åˆ—æ“ä½œå˜äØ“(f¨´)原子操作ã€?/span>

GNU C中x++是原子操作吗åQ?/span>
½{”案不是。x++ç”?条指令完成。x++在单CPU下不是原子操作ã€?/span>
对应3条汇¾~–指ä»?/span>
movl x, %eax
addl $1, %eax
movl %eax, x
在vc2005下对�/span>
++x;
004232FA mov eax,dword ptr [x]
004232FD add eax,1
00423300 mov dword ptr [x],eax
仍然�条指令�/span>
所ä»?+xåQŒx++½{‰éƒ½ä¸æ˜¯åŽŸå­æ“ä½œã€‚å› å…¶æ­¥éª¤åŒ…æ‹¬äº†(ji¨£n)从内存中取x值放入寄存器åQŒåŠ å¯„å­˜å™¨ï¼ŒæŠŠå€¼å†™å…¥å†…å­˜ä¸‰ä¸ªæŒ‡ä»¤ã€?/span>

如何实现x++的原子性?
在单处理器上åQŒå¦‚果执行x++æ—Óž¼Œ¼›æ­¢å¤šçº¿½E‹è°ƒåº¦ï¼Œž®±å¯ä»¥å®žçŽ°åŽŸå­ã€‚å› ä¸ºå•å¤„ç†çš„å¤š¾U¿ç¨‹òq¶å‘是伪òq¶å‘ã€?/span>
在多处理器上åQŒéœ€è¦å€ŸåŠ©cpu提供的Lock功能。锁æ€Èº¿ã€‚读取内存å€û|¼Œä¿®æ”¹åQŒå†™å›žå†…存三步期间禁止别的CPU讉K—®æ€Èº¿ã€‚同时我估计使用Lock指ä×o(h¨´)锁æ€Èº¿çš„æ—¶å€™ï¼ŒOS也不ä¼?x¨¬)把当前¾U¿ç¨‹è°ƒåº¦èµîCº†(ji¨£n)。要是调èµîCº†(ji¨£n)åQŒé‚£ž®±éº»çƒ?ch¨³)äº?ji¨£n)ã€?/span>

在多处理器系¾lŸä¸­å­˜åœ¨æ½œåœ¨é—®é¢˜çš„原因是åQ?/span>
不ä‹É用LOCK指ä×o(h¨´)前缀锁定æ€Èº¿çš„话åQŒåœ¨ä¸€‹Æ¡å†…存访问周期中有可能其他处理器ä¼?x¨¬)äñ”生异常或中断åQŒè€Œåœ¨å¼‚常处理中有可能ä¼?x¨¬)修改尚未写入的地址åQŒè¿™æ ·å½“INC操作完成后会(x¨¬)产生无效数据åQˆè¦†ç›–了(ji¨£n)前面的修改)(j¨ª)ã€?/span>

spinlock 用于CPU同步, 它的实现是基于CPU锁定数据æ€Èº¿çš„æŒ‡ä»?
当某个CPU锁住数据æ€Èº¿å? 它读一个内存单å…?spinlock_t)来判断这个spinlock 是否已经被别的CPU锁住. 如果å? 它写˜q›ä¸€ä¸ªç‰¹å®šå€? 表示锁定成功, 然后˜q”回. 如果æ˜? 它会(x¨¬)重复以上操作直到成功, 或者spin‹Æ¡æ•°­‘…过一个设定å€? 锁定数据æ€Èº¿çš„æŒ‡ä»¤åªèƒ½ä¿è¯ä¸€ä¸ªæœºå™¨æŒ‡ä»¤å†…, CPU独占数据æ€Èº¿.
单CPU当然能用spinlock, 但实çŽîC¸Šæ— éœ€é”å®šæ•°æ®æ€Èº¿.

spinlock在锁定的时å€?如果不成åŠ?不会(x¨¬)睡眠,ä¼?x¨¬)持¾l­çš„ž®è¯•,单cpu的时候spinlockä¼?x¨¬)让其它process动不äº?

]]>
sun.misc.Unsafehttp://www.aygfsteel.com/stevenjohn/archive/2015/03/15/423475.htmlabinabinSun, 15 Mar 2015 15:42:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/03/15/423475.htmlhttp://www.aygfsteel.com/stevenjohn/comments/423475.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/03/15/423475.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/423475.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/423475.html     å‡ å¥å…³äºŽUnsafeçš„åÆˆå‘æ€§ã€‚compareAndSwapæ–ÒŽ(gu¨©)³•æ˜?em>原子çš?òq¶ä¸”可用来实现高性能的、无锁的数据¾l“构。比å¦?考虑问题:在ä‹É用大量线½E‹çš„å…׃ín对象上增长倹{€?..
     Java是一门安全的¾~–程语言åQŒé˜²æ­¢ç¨‹åºå‘˜çŠ¯å¾ˆå¤šæ„šè ¢çš„é”™è¯¯åQŒå®ƒä»¬å¤§éƒ¨åˆ†æ˜¯åŸºäºŽå†…存管理的。但是,有一¿Uæ–¹å¼å¯ä»¥æœ‰æ„çš„æ‰§è¡Œä¸€äº›ä¸å®‰å…¨ã€å®¹æ˜“犯错的操作åQŒé‚£ž®±æ˜¯ä½¿ç”¨Unsafe¾c…R€?br />    CAS操作æœ?个操作数åQŒå†…存值MåQŒé¢„期值EåQŒæ–°å€¼UåQŒå¦‚æžœM==EåQŒåˆ™ž®†å†…å­˜å€ég¿®æ”¹äØ“(f¨´)BåQŒå¦åˆ™å•¥éƒ½ä¸åšã€?br />    sun.misc.Unsafe˜q™ä¸ª¾cÀL˜¯å¦‚æ­¤åœîC¸å®‰å…¨åQŒä»¥è‡³äºŽJDK开发者增加了(ji¨£n)很多ç‰ÒŽ(gu¨©)®Šé™åˆ¶æ¥è®¿é—®å®ƒã€‚它的构造器是私有的åQŒå·¥åŽ‚æ–¹æ³?span style="color: #993300;">getUnsafe()的调用器只能被Bootloader加蝲。如你在下面代码片段的第8行所见,˜q™ä¸ªå®¶ä¼™ç”šè‡³æ²¡æœ‰è¢«ä“Q何类加蝲器加载,所以它的类加蝲器是null。它ä¼?x¨¬)抛å?span style="color: #993300;">SecurityException 异常来阻止äçR入者ã€?br />    public final class Unsafe {
   ...
   private Unsafe() {}
   private static final Unsafe theUnsafe = new Unsafe();
   ...
   public static Unsafe getUnsafe() {
      Class cc = sun.reflect.Reflection.getCallerClass(2);
      if (cc.getClassLoader() != null)
          throw new SecurityException("Unsafe");
      return theUnsafe;
   }
   ...
}
òq¸è¿çš„æ˜¯˜q™é‡Œæœ‰ä¸€ä¸ªUnsafe的变量可以被用来取得Unsafe的实例。我们可以轻村֜°¾~–写一个复制方法通过反射来实玎ͼŒå¦‚下所½Cºï¼š(x¨¬)
åQ?a target="_blank" rel="nofollow">http://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/åQ?/div>
public static Unsafe getUnsafe() {
   try {
           Field f = Unsafe.class.getDeclaredField("theUnsafe");
           f.setAccessible(true);
           return (Unsafe)f.get(null);
   } catch (Exception e) {
       /* ... */
   }
}

Unsafe一些有用的ç‰ÒŽ(gu¨©)€?/strong>

  1. 虚拟æœ?#8220;集约åŒ?#8221;åQˆVM intrinsificationåQ‰ï¼š(x¨¬)如用于无锁Hash表中的CASåQˆæ¯”较和交换åQ‰ã€‚再比如compareAndSwapInt˜q™ä¸ªæ–ÒŽ(gu¨©)³•用JNI调用åQŒåŒ…含了(ji¨£n)对CAS有特ŒDŠå¼•导的本地代码。在˜q™é‡Œä½ èƒ½è¯Õdˆ°æ›´å¤šå…³äºŽCAS的信息:(x¨¬)http://en.wikipedia.org/wiki/Compare-and-swapã€?/li>
  2. ä¸ÀLœºè™šæ‹Ÿæœºï¼ˆè¯‘注åQšä¸»æœø™™šæ‹Ÿæœºä¸»è¦ç”¨æ¥½Ž¡ç†å…¶ä»–虚拟机。而虚拟åã^台我们看到只有guest VMåQ‰çš„sun.misc.Unsafe功能能够被用于未初始化的对象分配内存åQˆç”¨allocateInstanceæ–ÒŽ(gu¨©)³•åQ‰ï¼Œç„¶åŽž®†æž„造器调用解释为其他方法的调用ã€?/li>
  3. 你可以从本地内存地址中追ítªåˆ°˜q™äº›æ•°æ®ã€‚ä‹Éç”?span style="color: #993300;">java.lang.Unsafe¾c»èŽ·å–å†…å­˜åœ°å€æ˜¯å¯èƒ½çš„ã€‚è€Œä¸”å¯ä»¥é€šè¿‡unsafeæ–ÒŽ(gu¨©)³•直接操作˜q™äº›å˜é‡åQ?/li>
  4. 使用allocateMemoryæ–ÒŽ(gu¨©)³•åQŒå†…存可以被分配到堆外。例如当allocateDirectæ–ÒŽ(gu¨©)³•被调用时DirectByteBuffer构造器内部ä¼?x¨¬)ä‹Éç?span style="color: #993300;">allocateMemoryã€?/li>
  5. arrayBaseOffsetå’?span style="color: #993300;">arrayIndexScaleæ–ÒŽ(gu¨©)³•可以被用于开发arrayletsåQŒä¸€¿Uç”¨æ¥å°†å¤§æ•°¾l„åˆ†è§£äØ“(f¨´)ž®å¯¹è±¡ã€é™åˆ¶æ‰«æçš„实时消耗或者在大对象上做更新和¿UÕdЍã€?/li>

Unsafe.java是jdkòq¶å‘¾cÕdº“java.util.concurrent包中使用的底层类åQŒè¯¥¾cÖM¸­çš„æ–¹æ³•都是通过nativeæ–ÒŽ(gu¨©)³•调用操作¾pȝ»Ÿå‘½ä×o(h¨´)ã€?/p>

    在多¾U¿ç¨‹çŽ¯å¢ƒä¸‹ï¼Œä¸»è¦å­˜åœ¨ä¸¤ç§ç‰ÒŽ(gu¨©)®Šçš„场景:(x¨¬)

    1åQ›å¤šä¸ªçº¿½E‹åŒæ—¶è®¿é—®æŸä¸ªå¯¹è±¡çš„æ–ÒŽ(gu¨©)³•åQŒç”±äºŽæ“ä½œç³»¾lŸå¯¹¾U¿ç¨‹è°ƒåº¦çš„不¼‹®å®šæ€§ï¼Œå­˜åœ¨ä½¿è¯¥å¯¹è±¡çš„状态处于不一致的状态,ä¸ÞZº†(ji¨£n)避免˜q™ç§æƒ…å†µçš„å‘ç”Ÿï¼Œæˆ‘ä»¬å¯ä»¥å£°æ˜Žè¯¥æ–¹æ³•äØ“(f¨´)同步æ–ÒŽ(gu¨©)³•åQˆsynchronizedåQ‰ã€‚保证某一时刻只有一个线½E‹è°ƒç”¨è¯¥æ–ÒŽ(gu¨©)³•åQŒå…¶å®ƒè°ƒç”¨çº¿½E‹åˆ™è¢«é˜»å¡žã€‚è¿™¿Uæ–¹æ³•在òq¶å‘性很高的情况下会(x¨¬)产生大量的线½E‹è°ƒåº¦å¼€é”€ã€‚从而媄(ji¨£ng)响程序的òq¶å‘性能。在java.util.concurrent包中通过使用非阻塞原子方法,减少操作¾pȝ»Ÿçš„æ— ç”¨çº¿½E‹è°ƒåº¦å¼€é”€åQŒä»Žè€Œæé«˜åƈ发性能ã€?/p>

   2åQ›å¤š¾U¿ç¨‹é€šè¿‡æŸä¸ªå¯¹è±¡˜q›è¡Œé€šä¿¡åQŒå³å¸¸è§çš„生产者消费者模型。在以前的jdk版本中是通过wait,notifyæ–ÒŽ(gu¨©)³•实现的。该æ–ÒŽ(gu¨©)³•也是通过底层在某个信号量上的é˜Õd¡žé˜Ÿåˆ—实现的。而Unsafe¾cÖM¸­ç›´æŽ¥æä¾›æ“ä½œ¾pȝ»Ÿè°ƒåº¦å‘½ä×o(h¨´)park,unpark,减少信号量的开销åQŒæé«˜æ–°èƒ½ã€?/p>

   从上面可以看出,Unsafe¾cÀL˜¯é€šè¿‡æä¾›åº•层的操作系¾lŸå‘½ä»¤æŽ¥å£ç»™å¼€å‘者,从而提供程序的性能ã€?/p>



]]>javaòq¶å‘库之Executors常用的创建ExecutorService的几个方法说æ˜?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2015/01/21/422344.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 21 Jan 2015 14:18:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2015/01/21/422344.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/422344.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2015/01/21/422344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/422344.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/422344.html</trackback:ping><description><![CDATA[<p><strong>一、线½E‹æ± çš„创å»?/strong> </p><p> 我们可以通过ThreadPoolExecutor来创å»ÞZ¸€ä¸ªçº¿½E‹æ± ã€?br /></p><pre>new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds,runnableTaskQueue, handler);</pre><p>创徏一个线½E‹æ± éœ€è¦è¾“入几个参敎ͼš(x¨¬) </p><ul><li>corePoolSizeåQˆçº¿½E‹æ± çš„基本大ž®ï¼‰(j¨ª)åQšå½“提交一个ä“Q务到¾U¿ç¨‹æ± æ—¶åQŒçº¿½E‹æ± ä¼?x¨¬)创å»ÞZ¸€ä¸ªçº¿½E‹æ¥æ‰§è¡Œä»ÕdŠ¡åQŒå³ä½¿å…¶ä»–空闲的基本¾U¿ç¨‹èƒ½å¤Ÿæ‰§è¡Œæ–îC“Q务也ä¼?x¨¬)创建线½E‹ï¼Œ½{‰åˆ°éœ€è¦æ‰§è¡Œçš„ä»ÕdŠ¡æ•°å¤§äºŽçº¿½E‹æ± åŸºæœ¬å¤§å°æ—¶å°±ä¸å†åˆ›å¾ã€‚如果调用了(ji¨£n)¾U¿ç¨‹æ± çš„prestartAllCoreThreadsæ–ÒŽ(gu¨©)³•åQŒçº¿½E‹æ± ä¼?x¨¬)æå‰åˆ›å»ºåÆˆå¯åŠ¨æ‰€æœ‰åŸºæœ¬çº¿½E‹ã€?</li><li>runnableTaskQueueåQˆä“Q务队列)(j¨ª)åQšç”¨äºŽä¿å­˜ç­‰å¾…执行的ä»ÕdŠ¡çš„é˜»å¡žé˜Ÿåˆ—ã€?可以选择以下几个é˜Õd¡žé˜Ÿåˆ—ã€? <ul><li>ArrayBlockingQueueåQšæ˜¯ä¸€ä¸ªåŸºäºŽæ•°¾l„结构的有界é˜Õd¡žé˜Ÿåˆ—åQŒæ­¤é˜Ÿåˆ—æŒ?FIFOåQˆå…ˆ˜q›å…ˆå‡ºï¼‰(j¨ª)原则对元素进行排序ã€?</li><li>LinkedBlockingQueueåQšä¸€ä¸ªåŸºäºŽé“¾è¡¨ç»“构的é˜Õd¡žé˜Ÿåˆ—åQŒæ­¤é˜Ÿåˆ—按FIFO åQˆå…ˆ˜q›å…ˆå‡ºï¼‰(j¨ª) 排序元素åQŒåžåé‡é€šå¸¸è¦é«˜äºŽArrayBlockingQueue。静(r¨´n)态工厂方法Executors.newFixedThreadPool()使用äº?ji¨£n)这个队列ã€?</li><li>SynchronousQueueåQšä¸€ä¸ªä¸å­˜å‚¨å…ƒç´ çš„阻塞队列。每个插入操作必™åȝ­‰åˆ°å¦ä¸€ä¸ªçº¿½E‹è°ƒç”¨ç§»é™¤æ“ä½œï¼Œå¦åˆ™æ’入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueueåQŒé™(r¨´n)态工厂方法Executors.newCachedThreadPool使用äº?ji¨£n)这个队列ã€?</li><li>PriorityBlockingQueueåQšä¸€ä¸ªå…·æœ‰ä¼˜å…ˆçñ”的无限阻塞队列ã€?</li></ul></li><li>maximumPoolSizeåQˆçº¿½E‹æ± æœ€å¤§å¤§ž®ï¼‰(j¨ª)åQšçº¿½E‹æ± å…è®¸åˆ›å¾çš„æœ€å¤§çº¿½E‹æ•°ã€‚如果队列满äº?ji¨£n),òq¶ä¸”已创建的¾U¿ç¨‹æ•°å°äºŽæœ€å¤§çº¿½E‹æ•°åQŒåˆ™¾U¿ç¨‹æ± ä¼š(x¨¬)再创建新的线½E‹æ‰§è¡Œä“Q务。值得注意的是如果使用äº?ji¨£n)无界的ä»ÕdŠ¡é˜Ÿåˆ—˜q™ä¸ªå‚æ•°ž®±æ²¡ä»€ä¹ˆæ•ˆæžœã€?</li><li>ThreadFactoryåQšç”¨äºŽè®¾¾|®åˆ›å»ºçº¿½E‹çš„工厂åQŒå¯ä»¥é€šè¿‡¾U¿ç¨‹å·¥åŽ‚¾l™æ¯ä¸ªåˆ›å»ºå‡ºæ¥çš„¾U¿ç¨‹è®„¡½®æ›´æœ‰æ„ä¹‰çš„名字ã€?</li><li>RejectedExecutionHandleråQˆé¥±å’Œç­–略)(j¨ª)åQšå½“队列和线½E‹æ± éƒ½æ»¡äº?ji¨£n),说明¾U¿ç¨‹æ± å¤„于饱和状态,那么必须采取一¿Uç­–略处理提交的æ–îC“Q务。这个策略默认情况下是AbortPolicyåQŒè¡¨½Cºæ— æ³•处理新ä»ÕdŠ¡æ—¶æŠ›å‡ºå¼‚å¸¸ã€‚ä»¥ä¸‹æ˜¯JDK1.5提供的四¿Uç­–ç•¥ã€? <ul><li>AbortPolicyåQšç›´æŽ¥æŠ›å‡ºå¼‚常ã€?</li><li>CallerRunsPolicyåQšåªç”¨è°ƒç”¨è€…所在线½E‹æ¥˜qè¡Œä»ÕdŠ¡ã€?</li><li>DiscardOldestPolicyåQšä¸¢å¼ƒé˜Ÿåˆ—里最˜q‘的一个ä“Q务,òq¶æ‰§è¡Œå½“前ä“Q务ã€?</li><li>DiscardPolicyåQšä¸å¤„理åQŒä¸¢å¼ƒæŽ‰ã€?</li><li> 当然也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。如记录日志或持久化不能处理的ä“Q务ã€?</li></ul></li><li>keepAliveTimeåQˆçº¿½E‹æ´»åŠ¨ä¿æŒæ—¶é—ß_(d¨¢)¼‰(j¨ª)åQšçº¿½E‹æ± çš„工作线½E‹ç©ºé—²åŽåQŒä¿æŒå­˜?g¨°u)zÈš„æ—‰™—´ã€‚所以如果ä“Q务很多,òq¶ä¸”每个ä»ÕdŠ¡æ‰§è¡Œçš„æ—¶é—´æ¯”è¾ƒçŸ­åQŒå¯ä»¥è°ƒå¤§è¿™ä¸ªæ—¶é—ß_(d¨¢)¼Œæé«˜¾U¿ç¨‹çš„利用率ã€?</li><li>TimeUnitåQˆçº¿½E‹æ´»åŠ¨ä¿æŒæ—¶é—´çš„å•ä½åQ‰ï¼š(x¨¬)可选的单位有天åQˆDAYSåQ‰ï¼Œž®æ—¶åQˆHOURSåQ‰ï¼Œåˆ†é’ŸåQˆMINUTESåQ‰ï¼Œæ¯«ç§’(MILLISECONDS)åQŒå¾®¿U?MICROSECONDS, 千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)ã€?</li></ul><p> </p><p><strong>二、Executors提供äº?ji¨£n)一些方便创建ThreadPoolExecutor的常用方法,主要有以下几个:(x¨¬)</strong> </p><p><strong>1ã€?nbsp;Executors.newFixedThreadPool(int nThreads);创徏固定大小(nThreads,大小不能­‘…过int的最大å€?的线½E‹æ± </strong> </p><p>//¾U¿ç¨‹æ•°é‡ </p><p> int nThreads = 20; </p><p> //创徏executor æœåŠ¡  </p><p>  ExecutorService executor = Executors.newFixedThreadPool(nThreads) ; </p><p>重蝲后的版本åQŒéœ€è¦å¤šä¼ å…¥å®žçްäº?span style="font-family: monospace;">ThreadFactory接口的对象ã€?/span> </p><p><span style="font-family: "sans serif", tahoma, verdana, helvetica;"> ExecutorService executor = </span>Executors. <span style="font-family: "sans serif", tahoma, verdana, helvetica;">newFixedThreadPool</span>(nThreads,<span style="font-family: monospace;">threadFactory);</span> </p><p>说明åQšåˆ›å»ºå›ºå®šå¤§ž®?nThreads,大小不能­‘…过int的最大å€?的线½E‹æ± åQŒç¼“冲ä“Q务的队列为LinkedBlockingQueue,大小为整型的最大数åQŒå½“使用此线½E‹æ± æ—Óž¼Œåœ¨åŒæ‰§è¡Œçš„ä“Q务数量超˜q‡ä¼ å…¥çš„¾U¿ç¨‹æ± å¤§ž®å€¼åŽåQŒå°†ä¼?x¨¬)放入LinkedBlockingQueueåQŒåœ¨LinkedBlockingQueue中的ä»ÕdŠ¡éœ€è¦ç­‰å¾…çº¿½E‹ç©ºé—²åŽå†æ‰§è¡Œï¼Œå¦‚果攑օ¥LinkedBlockingQueue中的ä»ÕdŠ¡­‘…过整型的最大数æ—Óž¼ŒæŠ›å‡ºRejectedExecutionExceptionã€?</p><p><strong>2、Executors.newSingleThreadExecutor()åQšåˆ›å»ºå¤§ž®äØ“(f¨´)1的固定线½E‹æ± ã€?/strong> </p><p> ExecutorService executor = Executors.newSingleThreadExecutor(); </p><p>重蝲后的版本åQŒéœ€è¦å¤šä¼ å…¥å®žçްäº?span style="font-family: monospace;">ThreadFactory接口的对象ã€?/span> </p><p><span style="font-family: "sans serif", tahoma, verdana, helvetica;"> ExecutorService executor = </span>Executors. newSingleThreadScheduledExecutor(ThreadFactory threadFactory)  </p><p>说明åQšåˆ›å»ºå¤§ž®äØ“(f¨´)1的固定线½E‹æ± åQŒåŒæ—¶æ‰§è¡Œä“QåŠ?task)的只有一ä¸?其它的(ä»ÕdŠ¡åQ‰task都放在LinkedBlockingQueue中排队等待执行ã€?</p><p>3ã€?strong>Executors</strong>.<strong>newCachedThreadPool</strong>()åQ›åˆ›å»ºcorePoolSizeä¸?åQŒæœ€å¤§çº¿½E‹æ•°ä¸ºæ•´åž‹çš„æœ€å¤§æ•°åQŒçº¿½E‹keepAliveTimeä¸?分钟åQŒç¼“å­˜ä“Q务的队列为SynchronousQueue的线½E‹æ± ã€?</p><p> ExecutorService executor = Executors.newCachedThreadPool()åQ?</p><p> 当然也可以以下面的方式创建,重蝲后的版本åQŒéœ€è¦å¤šä¼ å…¥å®žçްäº?span style="font-family: monospace;">ThreadFactory接口的对象ã€?/span> </p><p><span style="font-family: "sans serif", tahoma, verdana, helvetica;"> ExecutorService executor = </span>Executors.newCachedThreadPool(ThreadFactory threadFactory) ; </p><p>说明åQšä‹É用时åQŒæ”¾å…¥çº¿½E‹æ± çš„taskä»ÕdŠ¡ä¼?x¨¬)复用线½E‹æˆ–启动新线½E‹æ¥æ‰§è¡ŒåQŒæ³¨æ„äº‹™å¹ï¼š(x¨¬)启动的线½E‹æ•°å¦‚æžœ­‘…过整型最大值后ä¼?x¨¬)抛出RejectedExecutionException异常åQŒå¯åŠ¨åŽçš„çº¿½E‹å­˜?g¨°u)zÀL—¶é—´äØ“(f¨´)一分钟ã€?</p><p><strong>4、Executors.newScheduledThreadPool(int corePoolSize):创徏corePoolSize大小的线½E‹æ± ã€?/strong> </p><p>//¾U¿ç¨‹æ•°é‡ </p><p> int corePoolSize= 20; </p><p> //创徏executor æœåŠ¡  </p><p>  ExecutorService executor = Executors.newScheduledThreadPool(corePoolSize) ; </p><p>重蝲后的版本åQŒéœ€è¦å¤šä¼ å…¥å®žçްäº?span style="font-family: monospace;">ThreadFactory接口的对象ã€?/span> </p><p><span style="font-family: "sans serif", tahoma, verdana, helvetica;"> ExecutorService executor = Executors.</span><span style="font-family: "sans serif", tahoma, verdana, helvetica;">newScheduledThreadPool</span>(<span style="font-family: "sans serif", tahoma, verdana, helvetica;">corePoolSize</span>, threadFactory)<span style="font-family: "sans serif", tahoma, verdana, helvetica;"> åQ?/span> </p><p> 说明åQšçº¿½E‹keepAliveTimeä¸?åQŒç¼“å­˜ä“Q务的队列为DelayedWorkQueueåQŒæ³¨æ„ä¸è¦è¶…˜q‡æ•´åž‹çš„æœ€å¤§å€¹{€?/p><p><br /><br /><br /><br /><br /><br /></p><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/422344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2015-01-21 22:18 <a href="http://www.aygfsteel.com/stevenjohn/archive/2015/01/21/422344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">²ìÑÅÏØ</a>| <a href="http://" target="_blank">ºÍÆ½ÏØ</a>| <a href="http://" target="_blank">¼Ó²éÏØ</a>| <a href="http://" target="_blank">ƽÑôÏØ</a>| <a href="http://" target="_blank">Ì©°²ÊÐ</a>| <a href="http://" target="_blank">µÂÖÝÊÐ</a>| <a href="http://" target="_blank">ÄþÇ¿ÏØ</a>| <a href="http://" target="_blank">¸»Ô£ÏØ</a>| <a href="http://" target="_blank">Ì쳤ÊÐ</a>| <a href="http://" target="_blank">¸·Æ½ÏØ</a>| <a href="http://" target="_blank">ÄÏÑôÊÐ</a>| <a href="http://" target="_blank">½ðƽ</a>| <a href="http://" target="_blank">»¨Á«ÊÐ</a>| <a href="http://" target="_blank">»á²ýÏØ</a>| <a href="http://" target="_blank">ÑÓÊÙÏØ</a>| <a href="http://" target="_blank">Àè´¨ÏØ</a>| <a href="http://" target="_blank">ÇåÔ·ÏØ</a>| <a href="http://" target="_blank">¸ÞÀ¼ÏØ</a>| <a href="http://" target="_blank">³ç×óÊÐ</a>| <a href="http://" target="_blank">À³Î÷ÊÐ</a>| <a href="http://" target="_blank">²ýÆ½Çø</a>| <a href="http://" target="_blank">°×ÀÊÏØ</a>| <a href="http://" target="_blank">ÉÌÇðÊÐ</a>| <a href="http://" target="_blank">ÃçÀõÏØ</a>| <a href="http://" target="_blank">¶÷Ê©ÊÐ</a>| <a href="http://" target="_blank">ÒÁ½ð»ôÂåÆì</a>| <a href="http://" target="_blank">èÈÑôÏØ</a>| <a href="http://" target="_blank">ÁùÅÌË®ÊÐ</a>| <a href="http://" target="_blank">ÎäÄþÏØ</a>| <a href="http://" target="_blank">½ðÉ³ÏØ</a>| <a href="http://" target="_blank">·ïÑôÏØ</a>| <a href="http://" target="_blank">ÄÏÀÖÏØ</a>| <a href="http://" target="_blank">ÆÖ½­ÏØ</a>| <a href="http://" target="_blank">·½³ÇÏØ</a>| <a href="http://" target="_blank">¾ÅÁúÏØ</a>| <a href="http://" target="_blank">ºÏÑôÏØ</a>| <a href="http://" target="_blank">Ë®¸»ÏØ</a>| <a href="http://" target="_blank">ÃÜÔÆÏØ</a>| <a href="http://" target="_blank">ÁÙÌ¶ÏØ</a>| <a href="http://" target="_blank">кÓÏØ</a>| <a href="http://" target="_blank">аͶû»¢ÓÒÆì</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>