Ò»£®Ï̵߳Ĵ´½¨ºÍÆô¶¯
javaʹÓÃThreadÀà´ú±íỊ̈߳¬ËùÓеÄÏ̶߳ÔÏó¶¼±ØÐëÊÇThreadÀà»òÆä×ÓÀàµÄʵÀý¡£Ã¿ÌõÏ̵߳Ä×÷ÓÃÊÇÍê³ÉÒ»¶¨µÄÈÎÎñ£¬Êµ¼ÊÉϾÍÊÇÖ´ÐÐÒ»¶Î³ÌÐòÁ÷£¨Ò»¶Î˳ÐòÁ÷µÄ´úÂ룩¡£JavaʹÓÃrun·½·¨À´·â×°ÕâÑùÒ»¶Î³ÌÐò¡£
1.¼Ì³ÐThreadÀà´´½¨Ïß³ÌÀà
/**¼Ì³ÐThreadÀ´´´½¨Ïß³ÌÀà*/ public class FirstThread extends Thread { private int i; //ÖØÐ´run·½·¨£¬run·½·¨µÄ·½·¨Ìå¾ÍÊÇÏß³ÌÖ´ÐÐÌå public void run() { for(;i<10;i++){ System.out.println(this.getName()+":"+i); } } public static void main(String []args){ for(int i=0;i<20;i++){ System.out.println(Thread.currentThread().getName()+" .."+i); if(i==10){ System.out.println("--------------------------------------------"); new FirstThread().start(); new FirstThread().start(); System.out.println("---------------------------------------------"); } } } } ½á¹û£ººìÉ«²¿·Öÿ´ÎÔËÐж¼²»Ò»Ö£¬ÒòΪ¶àÏß³ÌÒ²ÊDz¢·¢µÄ main ..0 main ..1 main ..2 main ..3 main ..4 main ..5 main ..6 main ..7 main ..8 main ..9 main ..10 -------------------------------------------- Thread-0:0 --------------------------------------------- Thread-1:0 Thread-1:1 Thread-1:2 Thread-1:3 Thread-0:1 Thread-1:4 Thread-1:5 main ..11 Thread-1:6 Thread-1:7 Thread-1:8 Thread-1:9 Thread-0:2 Thread-0:3 main ..12 main ..13 ...... |
×Ü½á £º´ÓÉÏÃæ½á¹û¿ÉÒÔ¿´³öThread-0ºÍThread-1Á½ÌõÏß³ÌÊä³öµÄi±äÁ¿¶¼²»Á¬Ðø£¨×¢Ò⣺i±äÁ¿ÊÇFirestThreadµÄʵÀýÊôÐÔ£¬¶ø²»ÊǾֲ¿±äÁ¿£¬µ«ÒòΪ³ÌÐòÿ´Î´´½¨Ï̶߳¼»á´´½¨Ò»¸öFirstThread¶ÔÏó£¬ËùÒÔThread-0ºÍThread-1²»Äܹ²Ïí¸ÃʵÀýÊôÐÔ£©¡£
ʹÓü̳ÐThreadÀàµÄ·½·¨À´´´½¨Ïß³ÌÀ࣬¶àÌõÏß³ÌÖ®¼äÎÞ·¨¹²ÏíÏß³ÌÀàµÄʵÀý±äÁ¿¡£
2.ʵÏÖRunnable½Ó¿Ú´´½¨Ïß³ÌÀà
public class SecondThread implements Runnable { private int i; public void run() { for(;i<20;i++){ System.out.println(Thread.currentThread().getName()+":"+i); } } public static void main(String [] args){ for(int i=0;i<20;i++){ System.out.println(Thread.currentThread().getName()+" .."+i); if(i==10){ SecondThread st=new SecondThread(); //ͨ¹ýnew Thread£¨ Runable target,String name£©À´´´½¨ÐÂÏß³Ì new Thread(st,"Ïß³Ì1").start(); new Thread(st,"Ïß³Ì2").start(); } } } ½á¹û£ººìÉ«²¿·Öÿ´ÎÔËÐж¼²»Ò»Ö£¬ÒòΪ¶àÏß³ÌÒ²ÊDz¢·¢µÄ main ..0 main ..1 main ..2 main ..3 main ..4 main ..5 main ..6 main ..7 main ..8 main ..9 main ..10 -------------------------------------------- Ïß³Ì1:0 -------------------------------------------- Ïß³Ì1:1 Ïß³Ì2:1 Ïß³Ì2:3 main ..11 Ïß³Ì2:4 Ïß³Ì2:5 Ïß³Ì2:6 Ïß³Ì1:2 Ïß³Ì2:7 Ïß³Ì2:9 Ïß³Ì2:10 Ïß³Ì2:11 Ïß³Ì2:12 Ïß³Ì2:13 main ..12 Ïß³Ì2:14 Ïß³Ì2:15 Ïß³Ì2:16 Ïß³Ì2:17 Ïß³Ì1:8 Ïß³Ì2:18 main ..13 main ..14 Ïß³Ì1:19 main ..15 main ..16 main ..17 ¡£¡£¡£¡£ |
×ܽá:¸ù¾ÝÔ´´úÂëÖÐThreadÀ๹Ôì·½·¨ Ruanalbe½Ó¿Ú¶ÔÏótargetÖ»ÄÜ×÷Ϊ²ÎÊý´«µÝµ½Thread¹¹Ôì·½·¨ÖУ¬ËùÒÔ¶à¸öÏ߳̿ÉÒÔ¹²ÓÃÒ»¸öRunnable¶ÔÏó£¬ÒòΪ¶¼ÓÃͬһ¸öRunnable¶ÔÏóËùÒÔÔÚRunnableʵÏÖÀàµÄʵÀý±äÁ¿Ò²¿ÉÒÔ¹²ÏíÁË¡£
ËùÒÔRunable·Ç³£Êʺ϶à¸öÏàͬÏß³ÌÀ´´¦Àíͬһ·Ý×ÊÔ´µÄÇé¿ö¡£
¶þ£®Ï̵߳ÄÉúÃüÖÜÆÚ
1.Newн¨ :µ±Ï̱߳»´´½¨Ê±£¬¸ÃÏ̴߳¦ÓÚн¨×´Ì¬£¬´ËʱËüºÍÆäËûjava¶ÔÏóÒ»Ñù£¬½ö½öÓÉJavaÐéÄâ»úΪÆä·ÖÅäÁËÄڴ棬²¢³õʼ»¯ÁËÆä³ÉÔ±±äÁ¿µÄÖµ¡££¨´ËʱµÄÏß³ÌûÓбíÏÖ³öÈκαíÏÖ³öÈκÎÏ̵߳Ķ¯Ì¬ÌØÕ÷£¬³ÌÐòÒ²²»»áÖ´ÐÐÏ̵߳ÄÏß³ÌÖ´ÐÐÌ壩new
Thread£¨£©||new Thread£¨Runnable target£¬String name£©¡£
2.Runnable¾ÍÐ÷:¾ÍÐ÷Ò²¾ÍÊÇ˵Æô¶¯Ị̈߳¬µ«ÊÇÆô¶¯Ïß³ÌʹÓÃstart·½·¨£¬¶ø²»ÊÇrun·½·¨£¡ÓÀÔ¶²»Òªµ÷ÓÃÏ̶߳ÔÏóµÄrun()·½·¨£¡µ÷ÓÃstart·½·¨À´Æô¶¯Ị̈߳¬ÏµÍ³»á½«¸Ãrun·½·¨µ±³ÉÏß³ÌÖ´ÐÐÌåÀ´´¦Àí¡£Èç¹ûÖ±½Óµ÷ÓÃÏ̶߳ÔÏóµÄrun·½·¨¡£Ôòrun·½·¨»áÁ¢¼´Ö´ÐУ¬ÇÒÔÚÕâ¸örun·½·¨µÄÖ´ÐÐÌåδִÐнáÊøÇ°ÆäËûÏß³ÌÎÞ·¨²¢·¢Ö´ÐУ¨¼´ÏµÍ³»á½«run·½·¨µ±×öÒ»¸öÆÕͨ¶ÔÏóµÄÆÕͨ·½·¨£¬¶ø²»ÊÇÏß³ÌÖ´ÐÐÌå¶Ô´ý£©
¸½1£ºÈç¹ûÓÐÒ»¸öÖ÷Ị̈߳¬Ò»¸ö×ÓÏ̡߳£µ±¸ù¾ÝÂß¼´úÂë¸Ãµ÷ÓÃ×ÓÏß³Ìʱ²»Ò»¶¨»áÁ¢¼´µ÷Óã¬ÎªÁËÏëÔÚ×ÓÏß³Ìstart£¨£©ºóÁ¢¼´µ÷ÓÃ×ÓỊ̈߳¬¿ÉÒÔ¿¼ÂÇʹÓÃThread.sleep£¨1£©£¬ÕâÑù»áÈõ±Ç°Ị̈߳¨Ö÷Ị̈߳©Ë¯Ãß1ºÁÃ룬ÒòΪcpuÔÚÕâ1ºÁÃëÖÐÊDz»»áÐÝÏ¢µÄ£¬ÕâÑù¾Í»áÈ¥Ö´ÐÐÒ»Ìõ´¦ÓÚ¾ÍÐ÷״̬µÄÏ̡߳£
¸½2£º²»ÄܶÔÒѾ´¦ÓÚ¾ÍÐ÷״̬µÄỊ̈߳¬ÔÙ´ÎʹÓÃstart£¨£©
3.Running ÔËÐУºµ±´¦ÓÚ¾ÍÐ÷״̬ʱ£¬¸ÃÏ̻߳ñµÃcpu£¬Ö´ÐÐÌ忪ʼÔËÐУ¬¾Í´¦ÓÚÔËÐÐ״̬ÁË¡£
4.Blocked ×èÈû£ºÏ̲߳»¿ÉÄÜÒ»Ö±´¦ÓÚÔËÐÐ״̬£¨Ïß³ÌÖ´ÐÐÌå×ã¹»¶Ì£¬Ë²¼ä¾Í¿ÉÒÔÍê³ÉµÄÏß³ÌÅųý£©£¬Ï̻߳áÔÚÔËÐйý³ÌÖÐÐèÒª±»Öжϣ¬ÒòΪÊDz¢·¢£¬Ä¿µÄÊÇ»áÈÃÆäËûÏ̻߳ñµÃÖ´ÐеĻú»á£¬Ï̵߳ĵ÷¶Èϸ½ÚÈ¡¾öÓÚOS²ÉÓõIJßÂÔ¡££¨ÇÀռʽµ÷¶Èxp
win7 linux unix..£©¡£Èç¹ûÊÇÒ»Ð©ÌØÊâµÄСÐÍÉ豸¿ÉÄܲÉÓà Ð×÷ʽµ÷¶È£¨Ö»ÓÐÏß³Ì×Ô¼ºµ÷ÓÃËüµÄsleep£¨£©»òyield£¨£©²Å»á·ÅÆúËùÕ¼ÓõÄ×ÊÔ´£©¡£

5.DeadËÀÍö£º¸ù¾ÝÉÏͼËùʾ¡£²âÊÔ²âÊÔijÌõÏß³ÌÊÇ·ñÒѾËÀÍö£¬¿ÉÒÔµ÷ÓÃÏ̶߳ÔÏóµÄisAlive£¨£©·½·¨£¬µ±Ï̴߳¦ÓÚ¾ÍÐ÷£¬ÔËÐУ¬×èÈûʱ£¬·µ»Øtrue¡£Ï̴߳¦ÓÚн¨£¬ËÀÍöʱ·µ»Øfalse¡£
²»ÄܶÔÒѾËÀÍöµÄÏ̵߳÷ÓÃstart£¨£©·½·¨Ê¹ËüÖØÐÂÆô¶¯£¬ËÀÍö¾ÍÊÇËÀÍö£¬ÊDz»ÄÜÔÙ´Î×÷ΪÏß³ÌÖ´Ðеġ£
µ±Ö÷Ï߳̽áÊøÊ±ºò£¬ÆäËûÏ̲߳»ÊÜÈκÎÓ°Ï죬²¢²»»áËæÖ®½áÊø¡£Ò»µ©×ÓÏß³ÌÆô¶¯ÆðÀ´ºó£¬Ëü¾ÍÓµÓкÍÖ÷Ïß³ÌÏàͬµÄµØÎ»£¬Ëü²»»áÊܵ½Ö÷Ï̵߳ÄÓ°Ïì¡£
Èý£®¿ØÖÆÏß³Ì
1.joinỊ̈߳º
ÈÃÒ»¸öÏ̵߳ȴýÁíÒ»¸öÏß³ÌÍê³ÉµÄ·½·¨£ºjoin£¨£©¡£µ±ÔÚij¸ö³ÌÐòÖ´ÐÐÁ÷Öе÷ÓÃÆäËûÏ̵߳Äjoin£¨£©·½·¨£¬ÄǸÃÖ´ÐÐÁ÷¶ÔÓ¦µÄÏ߳̾ͻá×èÈû£¬ÖªµÀ±»join£¨£©¼ÓÈëµÄjoinÏß³ÌÍê³ÉΪֹ¡£join·½·¨Í¨³£ÓÐʹÓÃÏ̵߳ijÌÐòµ÷Ó㬽«´óÎÊÌâ»®·Ö³ÉÐí¶àСÎÊÌ⣬ÿ¸öСÎÊÌâ·ÖÅäÒ»¸öÏ̡߳£µ±ËùÓеÄСÎÊÌâ¶¼µÃµ½´¦Àíºó£¬ÔÙµ÷ÓÃ
Ö÷Ïß³ÌÀ´½øÒ»²½²Ù×÷£¨Thread t=new Thread();t.start();t.join¼òµ¥À´Ëµ¾ÍÊǼÓÈëµ½tÏ̡߳£µÈtÏß³ÌÖ´ÐÐÍê³Éºó²Å»á·µ»Ø³öÀ´Ö´ÐÐÏ̡߳££©
Join·½·¨ÓÐÈýÖÖÖØÓÃÐÎʽ£º
Join£¨£©£ºµÈ´ý±»joinµÄÏß³ÌÖ´ÐÐÍê³É
Join£¨long millis£©:µÈ´ýjoinÏ̵߳Äʱ¼ä×ΪmillisºÁÃ룬Èç¹ûÔÚÕâ¸öʱ¼äÄÚ£¬±»joinµÄÏ̻߳¹Ã»ÓÐÖ´ÐнáÊøÔò²»Ôٵȴý£©
Join£¨long millis£¬int nanos£©Ç§·ÖÖ®Ò»ºÁÃ루²»Óã©
public class JoinThread implements Runnable{ @Override public void run() { for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+":"+i); } } public static void main(String [] args) throws InterruptedException{ //ʵÀý»¯Ò»¸öRunnable JoinThread jt=new JoinThread(); //´´½¨Ò»¸öÏß³Ì new Thread(jt).start(); for(int i=0;i<10;i++){ if(i==3){ Thread th=new Thread(jt); //Æô¶¯µÚ¶þ¸öÏß³Ì th.start(); //mainµÄÏß³ÌÖе÷ÓÃÁËthÏ̵߳Äjoin·½·¨ //Èõڶþ¸öÏß³ÌÖ´ÐÐÍê³ÉºóÔÙÖ´ÐÐmain th.join(); } System.out.println(Thread.currentThread().getName()+":"+i); } } } ½á¹û£º Thread-0:0 Thread-0:1 Thread-0:2 main:0 main:1 Thread-0:3 main:2 Thread-0:4 Thread-1:0 Thread-1:1 Thread-1:2 Thread-1:3 Thread-1:4 main:3 main:4 main:5 main:6 main:7 main:8 main:9 |
2.ºǫ́Ị̈߳º
public class DaemonThread implements Runnable{ @Override public void run() { for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+":"+i); } } public static void main(String [] args){ //Òª½«Ç°Ì¨Ïß³Ìת»»³Éºǫ́Ị̈߳¬ÐèÒªÔÚ¸ÃÏ̸߳Õн¨»¹Î´start£¨£©Ö®Ç°×ª»»¡£mainÏß³ÌÒ²ÊÇǰ̨Ïß³Ì //ËùÓÐǰ̨Ïß³ÌËÀÍöʱ£¬ºǫ́Ïß³ÌÒ²¾ÍËæÖ®ËÀÍö¡£ DaemonThread dt=new DaemonThread(); Thread td=new Thread(dt,"Ïß³Ì1"); System.out.println("main·½·¨ÊÇ·ñÊǺǫ́Ïß³Ì"+Thread.currentThread().isDaemon()); System.out.println("tdÏß³Ì×î³õÊÇ·ñÊǺǫ́Ïß³Ì"+td.isDaemon()); //Ö¸¶¨tdΪºǫ́Ïß³Ì td.setDaemon(true); System.out.println("tdÏß³ÌÖ´ÐÐsetDaemon·½·¨ºóÊÇ·ñÊǺǫ́Ïß³Ì"+td.isDaemon()); //¾ÍÐ÷Æô¶¯ºǫ́Ïß³Ì td.start(); for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+" "+i); } } } ½á¹û£ºÖ»ÒªÇ°Ì¨Ï߳̽áÊø£¬ºǫ́Ïß³ÌÒ²»áËæÖ®½áÊø£¬²¢²»ÊÇÂíÉϽáÊø main·½·¨ÊÇ·ñÊǺǫ́Ïß³Ìfalse tdÏß³Ì×î³õÊÇ·ñÊǺǫ́Ïß³Ìfalse tdÏß³ÌÖ´ÐÐsetDaemon·½·¨ºóÊÇ·ñÊǺǫ́Ïß³Ìtrue main 0 main 1 Ïß³Ì1:0 Ïß³Ì1:1 main 2 Ïß³Ì1:2 Ïß³Ì1:3 main 3 Ïß³Ì1:4 Ïß³Ì1:5 main 4 Ïß³Ì1:6 Ïß³Ì1:7 Ïß³Ì1:8 Ïß³Ì1:9 Ïß³Ì1:10 Ïß³Ì1:11 Ïß³Ì1:12 Ïß³Ì1:13 |
3.Ïß³Ì˯Ãߣºsleep
/** * Ïß³Ì˯ÃߣºsleepÓÐÁ½ÖÖÖØÔØÐÎʽ£º * static void sleep£¨long millis£© * static void sleep£¨long millis£¬int nanos£© * */ public class SleepThread { public static void main(String [] args) throws InterruptedException{ for(int i=0;i<5;i++){ System.out.println("Ị̈߳º"+Thread.currentThread().getName()+"µ±Ç°Ê±¼ä:"+new Date()); //Èõ±Ç°Ïß³ÌÔÝÍ£2Ãë Thread.sleep(2000); } } } ½á¹û£º Ị̈߳ºmainµ±Ç°Ê±¼ä:Fri Nov 04 18:51:33 CST 2011 Ị̈߳ºmainµ±Ç°Ê±¼ä:Fri Nov 04 18:51:35 CST 2011 Ị̈߳ºmainµ±Ç°Ê±¼ä:Fri Nov 04 18:51:37 CST 2011 Ị̈߳ºmainµ±Ç°Ê±¼ä:Fri Nov 04 18:51:39 CST 2011 Ị̈߳ºmainµ±Ç°Ê±¼ä:Fri Nov 04 18:51:41 CST 2011 |
4.Ïß³ÌÈò½£¨yield£©
/** * yield£¨£©·½·¨ÊÇÒ»¸öºÍsleep·½·¨ÓеãÀàËÆµÄ¾²Ì¬·½·¨¡£yieldÒ²¿ÉÒÔÈõ±Ç°ÕýÔÚÖ´ÐеÄÏß³ÌÔÝÍ£ * µ«Ëü²»»á×èÈû¸ÃỊ̈߳¬ËüÖ»Êǽ«¸ÃÏß³ÌתÈë¾ÍÐ÷״̬¡£yieldÖ»ÊÇÈõ±Ç°Ïß³ÌÔÝÍ£Ò»»á¶ù£¬ÈÃϵͳµÄ * µ÷¶ÈÆ÷ÖØÐµ÷¶ÈÒ»´Î£¨ÍêÈ«¿ÉÄܵÄÇé¿öÊÇ£ºµ±Ò»¸öÏ̵߳÷ÓÃÁËyield·½·¨ÔÝÍ£Ö®ºó£¬Ï̵߳÷¶ÈÆ÷ÓÖÂíÉÏ * ½«Æäµ÷¶È³öÀ´ÖØÐÂÖ´ÐС££© * ʵ¼ÊÉÏ£¬µ±Ç°Ï̵߳÷ÓÃÁËyield·½·¨ºó£¬Ö»ÓÐÓÅÏȼ¶ºÍµ±Ç°Ïß³ÌÏàͬ£¬ÉõÖÁÓÅÏȼ¶¸ßÓÚµ±Ç°Ï̵߳Ĵ¦ÓÚ * ¾ÍÐ÷״̬µÄÏ̲߳Żá»ñµÃÖ´Ðлú»á¡£ * */ public class YieldThread implements Runnable{ @Override public void run() { for(int i=0;i<50;i++){ System.out.println(Thread.currentThread().getName()+":"+i); if(i==20){ Thread.yield(); } } } public static void main(String [] args){ //Æô¶¯µÚÒ»Ìõ×ÓÏß³Ì Thread td1=new Thread(new YieldThread(),"Ïß³Ì1"); //×î¸ß¼¶ //td1.setPriority(Thread.MAX_PRIORITY); //Æô¶¯µÚ¶þÌõ×ÓÏß³Ì Thread td2=new Thread(new YieldThread(),"Ïß³Ì2"); //×îµÍ¼¶ td2.setPriority(Thread.MIN_PRIORITY); td1.start(); td2.start(); System.out.println(Thread.currentThread().getName()); } } |
×ܽ᣺sleepºÍyieldÇø±ð
A.sleep·½·¨ÔÝÍ£µ±Ç°Ïß³Ìºó£¬»á¸øÆäËûÏß³ÌÖ´Ðлú»á£¬²»»áÀí»áÆäËûÏ̵߳ÄÓÅÏȼ¶¡£¶øyieldÖ»»á¸øÓÅÏȼ¶>=µ±Ç°ÓÅÏȼ¶µÄÏß³ÌÖ´Ðлú»á
B.Sleep·½·¨»á½«Ïß³ÌתÈë×èÈû״̬£¬ÖªµÀ¾¹ý×èÈûʱ¼ä²Å»áתÈë¾ÍÐ÷״̬¡£¶øyieldÊDz»»á½«Ïß³ÌתÈë×èÈû״̬µÄ£¬ËüÖ»ÊÇÇ¿ÖÆµ±Ç°Ï߳̽øÈë¾ÍÐ÷״̬¡£
C.Sleep»áÅ׳öInterruptedExceptionÒì³£¡£¶øyieldûÓÐÉùÃ÷ÈκÎÒì³£
D.Sleep·½·¨±Èyield·½·¨ÓиüºÃµÄÒÆÖ²ÐÔ¡£
E.ͨ³£²»ÒÀ¿¿yieldÀ´¿ØÖƲ¢·¢Ï߳̿ØÖÆ
ËÄ£®¶àÏ̵߳Äͬ²½
ÒÔÒ»¸öȡǮÁÐ×ÓÀ´·ÖÎö£º£¨Óû§µÇ¼ÄÇЩʡÂÔ£©
AccoutÀࣺ
/**ÒøÐÐȡǮ£¬ÕË»§Àà*/ public class Accout { //ÕË»§±àºÅ private String accoutNo; //ÕË»§Óà¶î private double balance; //ÕË»§Ãû³Æ private String accoutName; public Accout(){ super(); } public Accout(String accoutNo,String accoutName, double balance) { super(); this.accoutNo = accoutNo; this.balance = balance; this.accoutName=accoutName; } public String getAccoutNo() { return accoutNo; } public void setAccoutNo(String accoutNo) { this.accoutNo = accoutNo; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public String getAccoutName() { return accoutName; } public void setAccoutName(String accoutName) { this.accoutName = accoutName; } //¸ù¾ÝaccoutNoheÀ´¼ÆËãAccoutµÄhashcodeºÍÅжÏequals @Override public int hashCode() { return accoutNo.hashCode(); } @Override public boolean equals(Object obj) { if(obj!=null&&obj.getClass()==Accout.class){ Accout target=(Accout)obj; return target.getAccoutNo().equals(accoutNo); } return false; } } |
DrawThreadÀà:
/**ȡǮµÄÏß³ÌÀà*/ public class DrawThread implements Runnable{ //Ä£ÄâÓû§ÕË»§ private Accout accout; //µ±Ç°È¡Ç®Ïß³ÌËùÏ£ÍûÈ¡µÃÖµ private double drawAmount; public DrawThread(Accout accout, double drawAmount) { super(); this.accout = accout; this.drawAmount = drawAmount; } //Èç¹û¶à¸öÏß³ÌÐÞ¸Äͬһ¸ö¹²ÏíÊý¾Ýʱ£¬»á·¢ÉúÊý¾Ý°²È«ÎÊÌâ public void run() { //ÕË»§Óà¶î´óÓÚÈ¡¿î½ð¶îʱ if(accout.getBalance()>=drawAmount){ //È¡¿î³É¹¦ System.out.println(Thread.currentThread().getName()+
accout.getAccoutName()+"È¡¿î³É¹¦£ºÍ³ö³®Æ±£º"+drawAmount); //ÐÞ¸ÄÓà¶î accout.setBalance(accout.getBalance()-drawAmount); System.out.println("µ±Ç°Óà¶îΪ£º"+accout.getBalance()); } //ÕË»§½ð¶î²»¹»Ê± else{ System.out.println("ÕË»§½ð¶î²»¹»£¬ÄúµÄÓà¶îÖ»ÓÐ"+accout.getBalance()); } } } |
TestDraw²âÊÔÀࣺ
public class TestDraw { public static void main(String[]args) throws InterruptedException{ //´´½¨Ò»¸öÓû§ Accout acct=new Accout("123456", "СÃ÷", 1000); //Ä£ÄâËĸöÏß³Ìͬʱ²Ù×÷ DrawThread dt=new DrawThread(acct,600); //DrawThread dt1=new DrawThread(acct,800); Thread th1=new Thread(dt,"Ïß³Ì1"); Thread th2=new Thread(dt,"Ïß³Ì2"); Thread th3=new Thread(dt,"Ïß³Ì3"); Thread th4=new Thread(dt,"Ïß³Ì4"); th4.join(); th1.start(); th2.start(); th3.start(); th4.start(); } } |
1.ͬ²½´úÂë¿é
Java¶àÏß³ÌÖ§³ÖÒýÈëÁËͬ²½¼àÊÓÆ÷À´½â¾ö¶àḬ̈߳²È«£¬Í¬²½¼àÊÓÆ÷µÄ³£Ó÷½·¨¾ÍÊÇͬ²½´úÂë¿é£º
Synchronized(obj){ //...ͬ²½´úÂë¿é } |
À¨ºÅÖеÄobj¾ÍÊÇͬ²½¼àÊÓÆ÷:ÉÏÃæµÄÓï¾ä±íʾ£ºÏ߳̿ªÊ¼Ö´ÐÐͬ²½´úÂë¿é֮ǰ£¬±ØÐëÏÈ»ñµÃ¶Ôͬ²½¼àÊÓÆ÷µÄËø¶¨¡£Õâ¾ÍÒâζ×ÅÈκÎʱ¿ÌÖ»ÄÜÓÐÒ»ÌõÏ߳̿ÉÒÔ»ñµÃ¶Ôͬ²½¼àÊÓÆ÷µÄËø¶¨£¬µ±Í¬²½´úÂë¿éÖ´ÐнáÊøºó£¬¸ÃÏß³Ì×ÔÈ»ÊÍ·ÅÁ˶ԸÃͬ²½¼àÊÓÆ÷µÄËø¶¨¡£
ËäÈ»javaÖжÔͬ²½¼àÊÓÆ÷ʹÓõĶÔÏóûÓÐÈκÎÒªÇ󣬵«¸ù¾Ýͬ²½¼àÊÓÆ÷µÄÄ¿µÄ£º×èÖ¹Á½ÌõÏ̶߳Ôͬһ¸ö¹²Ïí×ÊÔ´½øÐв¢·¢·ÃÎÊ¡£ËùÒÔÒ»°ã½«¿ÉÄܱ»²¢·¢·ÃÎʵĹ²Ïí×ÊÔ´³äµ±Í¬²½¼àÊÓÆ÷¡£
Ð޸ĺóÈçÏ£º
public void run() { synchronized (accout) { //ÕË»§Óà¶î´óÓÚÈ¡¿î½ð¶îʱ if(accout.getBalance()>=drawAmount){ //È¡¿î³É¹¦ System.out.println(Thread.currentThread().getName()+accout.getAccoutName()+"È¡¿î³É¹¦£ºÍ³ö³®Æ±£º"+drawAmount); //ÐÞ¸ÄÓà¶î accout.setBalance(accout.getBalance()-drawAmount); System.out.println("µ±Ç°Óà¶îΪ£º"+accout.getBalance()); } //ÕË»§½ð¶î²»¹»Ê± else{ System.out.println("ÕË»§½ð¶î²»¹»£¬ÄúµÄÓà¶îÖ»ÓÐ"+accout.getBalance()); } } } |
2.ͬ²½·½·¨
£¨synchronized¿ÉÒÔÐÞÊη½·¨£¬´úÂë¿é¡£²»ÄÜÐÞÊÎÊôÐԺ͹¹Ôì·½·¨£©
³ýÁËͬ²½´úÂë¿éÍ⻹¿ÉÒÔʹÓÃsynchronized¹Ø¼ü×ÖÀ´ÐÞÊη½·¨£¬ÄÇôÕâ¸öÐÞÊιýµÄ·½·¨³ÆÎªÍ¬²½·½·¨¡£¶ÔÓÚͬ²½·½·¨À´Ëµ£¬ÎÞÐèÏÔʽָ¶¨Í¬²½¼àÊÓÆ÷£¬Í¬²½·½·¨µÄͬ²½¼àÊÓÆ÷ÊÇthis£¬Ò²¾ÍÊǸöÔÏó±¾Éí£¬Ò²¾ÍÊÇÉÏÃæTestDrawÖж¨ÒåµÄAccoutÀàÐ͵Äacct¡£
public void run() { draw(); } public synchronized void draw(){ if(accout.getBalance()>=drawAmount){ //È¡¿î³É¹¦ System.out.println(Thread.currentThread().getName()+accout.getAccoutName()+"È¡¿î³É¹¦£ºÍ³ö³®Æ±£º"+drawAmount); //ÐÞ¸ÄÓà¶î accout.setBalance(accout.getBalance()-drawAmount); System.out.println("µ±Ç°Óà¶îΪ£º"+accout.getBalance()); } //ÕË»§½ð¶î²»¹»Ê± else{ System.out.println("ÕË»§½ð¶î²»¹»£¬ÄúµÄÓà¶îÖ»ÓÐ"+accout.getBalance()); } } |
ÕâÀï×îºÃÊǽ«draw£¨£©·½·¨Ð´µ½AccoutÖУ¬¶ø²»ÊÇÏñ֮ǰ½«È¡Ç®ÄÚÈݱ£´æÔÚrun·½·¨ÖУ¬ÕâÖÖ×ö·¨²Å¸ü·ûºÏÃæÏò¶ÔÏó¹æÔòÖеÄDDD£¨Domain
Driven DesignÁìÓòÇý¶¯Éè¼Æ£©
¶ÔÓڿɱäÀàµÄͬ²½»á½µµÍ³ÌÐòÔËÐÐЧÂÊ¡£²»Òª¶ÔḬ̈߳²È«ÀàµÂËùÓз½·¨½øÐÐͬ²½£¬Ö»¶ÔÄÇЩ»á¸Ä±ä¹²Ïí×ÊÔ´µÄ·½·¨Í¬²½¡£
µ¥Ï̻߳·¾³£¨¿ÉÒÔʹÓÃÏ̲߳»°²È«°æ±¾±£Ö¤ÐÔÄÜ£© ¶àÏ̻߳·¾³£¨Ḭ̈߳²È«°æ±¾£©
2.1ͬ²½¼àÊÓÆ÷µÄËø¶¨Ê²Ã´Ê±ºòÊÍ·Å
A.µ±Ç°Ï̵߳Äͬ²½·½·¨£¬Í¬²½¿éÖ´ÐнáÊø¡£µ±Ç°Ïß³ÌÊÍ·Åͬ²½¼àÊÓÆ÷
B.ÔÚͬ²½·½·¨£¬¿éÖÐÓöµ½break£¬returnÖÕÖ¹Á˸ôúÂë¿é£¬·½·¨.ÊÍ·Å
C.ÔÚ´úÂë¿é£¬·½·¨ÖгöÏÖError£¬Exception
D.Ö´ÐÐͬ²½Ê±£¬³ÌÐòÖ´ÐÐÁËͬ²½¼àÊÓÆ÷¶ÔÏóµÄwait£¨£©·½·¨£¬Ôòµ±Ç°Ïß³ÌÔÝÍ££¬ÊÍ·Å
2.2ͬ²½¼àÊÓÆ÷µÄËø¶¨ÔÚÒÔÏÂÇé¿ö²»»á±»ÊÍ·Å
A.Ö´ÐÐͬ²½Ê±£¬³ÌÐòµ÷ÓÃThread.sleep£¨£©£¬Thread.yield£¨£©·½·¨À´ÔÝÍ£µ±Ç°Ï̵߳ÄÖ´ÐУ¬²»»áÊÍ·Å
B.Ö´ÐÐͬ²½Ê±£¬ÆäËûÏ̵߳÷ÓÃÁ˸ÃÏ̵߳Äsuspend·½·¨½«¸ÃÏß³Ì¹ÒÆð£¬²»»áÊÍ·Å£¨µ«ÊǾ¡Á¿±ÜÃâʹÓÃsuspendºÍresumeÀ´¿ØÖÆÏß³Ì,ÈÝÒ×µ¼ÖÂËÀËø£©
3.ͬ²½Ëø(Lock)
ÔÚjdk1.5ºó£¬java³ýÁËÉÏÃæÁ½ÖÖͬ²½´úÂë¿éºÍͬ²½·½·¨Ö®Í⣬»¹ÌṩÁËÒ»ÖÖÏß³Ìͬ²½»úÖÆ£ºËüͨ¹ýÏÔʾ¶¨Òåͬ²½Ëø¶ÔÏóÀ´ÊµÏÖͬ²½£¬ÔÚÕâÖÖ»úÖÆÏ£¬Í¬²½ËøÓ¦¸ÃʹÓÃLock¶ÔÏó³äµ±¡£
LockÊÇ¿ØÖƶà¸öÏ̶߳Թ²Ïí×ÊÔ´½øÐзÃÎʵŤ¾ß£¬Ã¿´ÎÖ»ÄÜÓÐÒ»¸öÏ̶߳ÔLock¶ÔÏó¼ÏËø£¬Ï߳̿ªÊ¼·ÃÎʹ²Ïí×ÊԴ֮ǰӦÏÈ»ñµÃLock¶ÔÏó¡££¨ÌØÀý£ºReadWriteLockËø¿ÉÄÜÔÊÐí¶Ô¹²Ïí×ÊÔ´²¢·¢·ÃÎÊ£©¡£ÔÚʵÏÖḬ̈߳²È«¿ØÖÆÖУ¬Í¨³£Ï²»¶Ê¹ÓÿÉÖØÓÃËø£¨ReentrantLock£©£¬Ê¹ÓøÃLock¶ÔÏó¿ÉÒÔÏÔʾµÄ¼ÓËø£¬ÊÍ·ÅËø¡£
CODE£º
//ÉùÃ÷Ëø¶ÔÏó private final ReentrantLock relock=new ReentrantLock(); public void run(){ draw(); } public void draw() { //¼ÓËø relock.lock(); try{ //ÕË»§Óà¶î´óÓÚÈ¡¿î½ð¶îʱ if(accout.getBalance()>=drawAmount){ //È¡¿î³É¹¦ System.out.println(Thread.currentThread().getName()+accout.getAccoutName()+"È¡¿î³É¹¦£ºÍ³ö³®Æ±£º"+drawAmount); //ÐÞ¸ÄÓà¶î accout.setBalance(accout.getBalance()-drawAmount); System.out.println("µ±Ç°Óà¶îΪ£º"+accout.getBalance()); } //ÕË»§½ð¶î²»¹»Ê± else{ System.out.println("ÕË»§½ð¶î²»¹»£¬ÄúµÄÓà¶îÖ»ÓÐ"+accout.getBalance()); } } //ÊÍ·ÅËø finally{ relock.unlock(); }} |
×ܽ᣺
ͬ²½·½·¨ºÍͬ²½´úÂë¿éʹÓÃÓë¹²Ïí×ÊÔ´Ïà¹ØµÄ£¬ÒþʽµÄͬ²½¼àÊÓÆ÷£¬²¢ÇÒÇ¿ÖÆÒªÇó¼ÓËøºÍÊÍ·ÅËøÒª³öÏÖÔÚÒ»¸ö¿é½á¹¹ÖУ¬¶øÇÒµ±»ñÈ¡Á˶à¸öËøÊ±£¬ËüÃDZØÐëÒÔÏà·´µÄ˳ÐòÊÍ·Å£¬ÇÒ±ØÐëÔÚÓëËùÓÐËø±»»ñȡʱÏàͬµÄ·¶Î§ÄÚÊÍ·ÅËùÓÐËø¡£
ËäȻͬ²½·½·¨£¬´úÂë¿éµÄ·¶Î§»úÖÆÊ¹¶àḬ̈߳²È«±à³Ì·Ç³£·½±ã£¬»¹¿ÉÒÔ±ÜÃâºÜ¶àÉæ¼°ËøµÄ³£¼û±à³Ì´íÎ󣬵«ÓÐʱҲÐèÒªÒÔ¸üÁé»îµÄ·½Ê½Ê¹ÓÃËø¡£LockÌṩÁËͬ²½·½·¨£¬´úÂë¿éÖÐûÓÐµÄÆäËû¹¦ÄÜ£¨ÓÃÓÚ·Ç¿é½á¹¹µÄtryLock·½·¨£¬»ñÈ¡¿ÉÖжÏËølockInterruptibly·½·¨£¬»ñÈ¡³¬Ê±Ê§Ð§ËøµÄtryLock£¨long£¬TimeUnit£©·½·¨£©¡£
ReentrantLockËø¾ßÓÐÖØÈëÐÔ£¬¼´Ï߳̿ÉÒÔ¶ÔËüÒѾ¼ÓËøµÄReentrantLockËøÔٴμÓËø£¬ReentrantLock¶ÔÏó»áά³ÖÒ»¸ö¼ÆÊýÆ÷À´×·×Ùlock·½·¨µÄǶÌ×µ÷Óã¬Ïß³Ìÿ´Îµ÷ÓÃlock()¼ÓËøºó£¬±ØÐëÏÔʾµÄµ÷ÓÃunlock£¨£©ÊÍ·ÅËø£¬ËùÒÔÒ»¶Î±»Ëø±£»¤µÄ´úÂë¿ÉÒÔµ÷ÓÃÁíÒ»¸ö±»ÏàÍ¬Ëø±£»¤µÄ·½·¨¡£
4.ËÀËø
µ±Á½¸öÏß³ÌÏ໥µÈ´ý¶Ô·½ÊÍ·Åͬ²½¼àÊÓÆ÷µÄʱºò¾Í»á·¢ÉúËÀËø£¬Ò»µ©³öÏÖËÀËø£¬Õû¸ö³ÌÐò¼È²»»á·¢ÉúÈκÎÒì³££¬Ò²²»»áÓÐÈκÎÌáʾ£¬Ö»ÊÇËùÓÐÏ̴߳¦ÓÚ×èÈû״̬£¬ÎÞ·¨¼ÌÐø¡£
Î壮Ïß³ÌͨÐÅ
Ïß³ÌÔÚϵͳÄÚÔËÐÐʱ£¬Ï̵߳ĵ÷¶È¾ßÓÐÒ»¶¨µÄ͸Ã÷ÐÔ£¬³ÌÐòͨ³£ÎÞ·¨×¼È·¿ØÖÆÏ̵߳ÄÂÖ»»Ö´ÐУ¬¿ÉÒÔͨ¹ýÒÔÏ·½·¨À´±£Ö¤Ïß³Ìе÷ÔËÐÐ.
1.Ïß³Ìе÷ÔËÐÐ
Èç¹û¶ÔÓÚһЩ·½·¨ÊÇÓÃͬ²½·½·¨»òÕßͬ²½´úÂë¿é£¬ÄÇô¿ÉÒÔµ÷ÓÃObjectÀàÌṩµÄwait£¨£©£¬notify£¨£©£¬notifyAll£¨£©¡£ÕâÈý¸ö²»ÊôÓÚThread£¬ÊôÓÚObjectÀ࣬µ«±ØÐëÓÉͬ²½¼àÊÓÆ÷À´µ÷Óã¨Í¬²½·½·¨µÄ¼àÊÓÆ÷ÊÇthis:ÔòÐèthis.wait()....,ͬ²½´úÂë¿éµÄ¼àÊÓÆ÷ÊÇÀ¨ºÅÖеÄobj.wait£¨£©£©£»
2.ʹÓÃÌõ¼þ±äÁ¿À´¿ØÖÆÐµ÷
Èç¹û³ÌÐòûÓÐʹÓÃsychronizedÀ´±£Ö¤Í¬²½£¬¿ÉÒÔʹÓÃLockÀ´±£Ö¤Í¬²½£¬ÔòϵͳÖоͲ»´æÔÚÒþʽµÄͬ²½¼àÊÓÆ÷¶ÔÏó£¬Ò²¾Í²»ÄÜʹÓÃwait£¬notify£¬notifyAllÀ´Ðµ÷ÁË¡£
private final Lock lock=new ReentrantLock(); private final Condition cond=lock.newCondition(); |
ͨ¹ýÉÏÃæÁ½ÐдúÂ룬Ìõ¼þConditionʵ¼ÊÊǰó¶¨ÔÚÒ»¸öLock¶ÔÏóÉϵġ£
Ïà¶ÔÓ¦µÄConditionÀàÒ²ÓÐÈý¸ö·½·¨£ºawait(),signal(),signalAll()

AccountÕ˺ÅÀࣺ
´úÂ룺
/** ÕË»§À࣬ÓÃÃæÏò¶ÔÏóµÄDDDÉè¼ÆÄ£Ê½À´Éè¼Æ */ /* * DDDÁìÓòÇý¶¯Ä£Ê½£¬¼´½«Ã¿¸öÀà¶¼ÈÏΪÊÇÒ»¸öÍ걸µÄÁìÓò¶ÔÏó£¬
ÀýÈçAccount´ú±íÕË»§À࣬ÄÇô¾ÍÓ¦¸ÃÌṩÓû§ÕË»§µÄÏà¹Ø·½·¨£¨´æ£¬È¡£¬×ª£©£¬¶ø²»Êǽ« * setXXX·½·¨±©Â¶³öÀ´ÈÎÈ˲Ù×÷¡£
Ö»ÒªÉè¼Æµ½DDD¾ÍÐèÒªÖØÐ´equalsºÍhashcodeÀ´Åж϶ÔÏóµÄÒ»ÖÂÐÔ */ public class Account { // ÕË»§±àÂë private String accountNo; // ÕË»§Óà¶î private double balance; // ±êʾÕË»§ÊÇ·ñÒÑÓдæ¿î(´ËÏîĿΪÁ˲âÊÔ´æÈë¿î¾ÍÐèÒªÂíÉÏÈ¡³ö) private boolean flag = false; // private final Lock lock=new ReentrantLock(); // private final Condition cond=lock.newCondition(); public Account() { super(); } public Account(String accountNo, double balance) { super(); this.accountNo = accountNo; this.balance = balance; } // È¡¿î(ÀûÓÃͬ²½·½·¨) public synchronized void draw(double drawAmount) { // Èç¹ûflagΪ¼Ù,ûÈË´æ¿î½øÈ¥£¬È¡Ç®·½·¨£¨ÀûÓÃwait£©×èÈû£¨wait×èÈûʱ£¬µ±Ç°Ï̻߳áÊÍ·Åͬ²½¼àÊÓÆ÷£© try { if (!flag) { this.wait();//Ìõ¼þ cond.await(); } //·ñÔòÖ´ÐÐȡǮ else { // System.out.println("ÕË»§Óà¶î£º"+balance); System.out.println(Thread.currentThread().getName()+"---->ȡǮ£º"+drawAmount); balance-=drawAmount; System.out.println("ÕË»§Óà¶î: "+balance); //ÉèÖÃflag£¨ÏÞ¶¨Ò»¸ö²Ù×÷Ö»ÄÜȡһ´ÎÇ®£© flag=false; //»½ÐÑÆäËûwait£¨£©Ïß³Ì this.notifyAll();//cond.signalAll(); } } catch (InterruptedException e) { e.printStackTrace(); } } //´æ¿î public synchronized void deposit(double depositAmount){ //Èç¹ûflagÎªÕæ£¬Ö¤Ã÷ÓÐÈË´æÇ®ÁË£¬´æÇ®×èÈû try { if (flag) { this.wait(); //cond.await(); } //·ñÔòÖ´Ðдæ¿î else { // System.out.println("ÕË»§Óà¶î£º"+balance); System.out.println(Thread.currentThread().getName()+"---->´æÇ®£º"+depositAmount); balance+=depositAmount; System.out.println("ÕË»§Óà¶î: "+balance); //ÉèÖÃflag£¨ÏÞ¶¨Ò»¸ö²Ù×÷Ö»ÄÜȡһ´ÎÇ®£© flag=true; //»½ÐÑÆäËûwait£¨£©Ïß³Ì this.notifyAll(); //cond.signalAll(); } } catch (InterruptedException e) { e.printStackTrace(); } } // DDDÉè¼ÆÄ£Ê½ÖØÐ´equalsºÍhashcode(ÅжÏÓû§ÊÇ·ñÒ»Ö£¬
Ö»ÐèÒªÅжÏËûÃǵÄÕ˺űàÂë¾Í¿ÉÒÔÁË£¬²»ÐèÒªÔÙÅжÏÕû¸ö¶ÔÏó£¬Ìá¸ßÐÔÄÜ) @Override public int hashCode() { return accountNo.hashCode(); } @Override public boolean equals(Object obj) { if (obj != null && obj.getClass() == Account.class) { Account account = (Account) obj; return account.getAccountNo().equals(accountNo); } return false; } public String getAccountNo() { return accountNo; } public void setAccountNo(String accountNo) { this.accountNo = accountNo; } |
ȡǮỊ̈߳º
public class DrawThread implements Runnable { /* * Ä£ÄâÓû§ */ private Account account; //Óû§È¡Ç®Êý private double drawAmount; public DrawThread(Account account, double drawAmount) { super(); this.account = account; this.drawAmount = drawAmount; } @Override public void run() { //ÖØ¸´10´ÎȡǮ²Ù×÷ for(int i=0;i<10;i++){ account.draw(drawAmount); } } } |
´æÇ®Ị̈߳º
public class DepositThread implements Runnable{ /* * Ä£ÄâÓû§ */ private Account account; //Óû§´æÇ®Êý private double depositAmount; public DepositThread(Account account, double depositAmount) { super(); this.account = account; this.depositAmount = depositAmount; } @Override public void run() { //ÖØ¸´10´Î´æÇ®²Ù×÷ for(int i=0;i<10;i++){ account.deposit(depositAmount); } } } |
²âÊÔÀࣺ
public class Test { public static void main(String []args){ //´´½¨Ò»¸öÓû§Ã»Óà¶î£¬µÈ´ýÏÈ´æ¿îºóȡǮ Account acct=new Account("123ÕÅ",0); //È¡¿î800 new Thread(new DrawThread(acct,800),"È¡¿îÕß").start(); //´æ¿î2¸öÈË new Thread(new DepositThread(acct,800),"´æ¿îÕß¼×").start(); new Thread(new DepositThread(acct,800),"´æ¿îÕßÒÒ").start(); new Thread(new DepositThread(acct,800),"´æ¿îÕß±û").start(); } } ½á¹û£º ´æ¿îÕß¼×---->´æÇ®£º800.0 ÕË»§Óà¶î: 800.0 È¡¿îÕß---->ȡǮ£º800.0 ÕË»§Óà¶î: 0.0 ´æ¿îÕß±û---->´æÇ®£º800.0 ÕË»§Óà¶î: 800.0 È¡¿îÕß---->ȡǮ£º800.0 ÕË»§Óà¶î: 0.0 ´æ¿îÕß¼×---->´æÇ®£º800.0 ÕË»§Óà¶î: 800.0 È¡¿îÕß---->ȡǮ£º800.0 ÕË»§Óà¶î: 0.0 ´æ¿îÕß±û---->´æÇ®£º800.0 ÕË»§Óà¶î: 800.0 È¡¿îÕß---->ȡǮ£º800.0 ÕË»§Óà¶î: 0.0 ´æ¿îÕß¼×---->´æÇ®£º800.0 ÕË»§Óà¶î: 800.0 È¡¿îÕß---->ȡǮ£º800.0 ÕË»§Óà¶î: 0.0 ´æ¿îÕß±û---->´æÇ®£º800.0 ÕË»§Óà¶î: 800.0 |
µ«¸ù¾ÝÉÏÃæÇé¿öÀ´¿´£¬ÏÔʾÓû§±»×èÈûÎÞ·¨¼ÌÐøÏòÏÂÖ´ÐУ¬ÕâÊÇÒòΪ´æÇ®ÓÐÈý¸öÏß³Ì
¹²ÓÐ3*10=30´Î²Ù×÷£¬¶øÈ¡Ç®Ö»ÓÐ10´Î£¬ËùÒÔ×èÈû¡£
×èÈûºÍËÀËøÊDz»Ò»Öµģ¬ÕâÀï×èÈûÖ»ÊÇÔڵȴýȡǮ¡£¡£¡£
3.ʹÓùܵÀÁ÷£¨Í¨ÐÅ£©
ÉÏÃæµÄ1,2Á½ÖÖÏ̲߳Ù×÷£¬ÓëÆä³ÆÎªÏ̼߳äµÄͨÐÅ£¬²»Èç³ÆÎªÏß³ÌÖ®¼äе÷ÔËÐеĿØÖƲßÂÔ»¹ÒªÇ¡µ±Ð©¡£Èç¹ûÐèÒªÔÚÁ½ÌõÏß³ÌÖ®¼ä¾ªÐѸü¶àµÄÐÅÏ¢½»»¥£¬Ôò¿ÉÒÔ¿¼ÂÇʹÓùܵÀÁ÷½øÐÐͨÐÅ¡£
¹ÜµÀÁ÷ÓÐ3ÖÐÐÎʽ£º
1.×Ö½ÚÁ÷£ºPipedInputStream,PipedOutputStream
2.×Ö·ûÁ÷£ºPipedReader,PipedWriter
3.ÐÂIOµÄ¹ÜÀíChannel£ºPipe.SinkChannel,Pipe.SourceChannel
ʹÓùܵÀµÄ²½Ö裺
1.new´´½¨¹ÜµÀÊäÈëÊä³öÁ÷
2.ʹÓùܵÀÊäÈë»òÊä³öÁ÷µÄconnect·½·¨Á¬½ÓÕâÁ½¸öÊäÈëÊä³öÁ÷
3.½«Á½¸ö¹ÜµÀÁ÷·Ö±ð´«ÈëÁ½¸öÏß³Ì
4.Á½¸öÏ̷ֱ߳ðÒÀÀµ¸÷×ÔµÄÁ÷À´½øÐÐͨÐÅ
µ«ÊÇÒòΪÁ½¸öÏß³ÌÊôÓÚͬһ¸ö½ø³Ì£¬ËüÃÇ¿ÉÒԷdz£·½±ãµÄ¹²ÏíÊý¾Ý£¬ÀûÓù²ÏíÕâ¸ö·½Ê½²ÅÓ¦¸ÃÊÇÏß³ÌÖ®¼ä½øÐÐÐÅÏ¢½»Á÷µÄ×îºÃ·½Ê½£¬¶ø²»ÊÇʹÓùܵÀÁ÷¡£Èç¹ûÊDzÙ×÷ÖîÈçÁÄÌìÊÒÄÇÑùµÄ»°£¬ÓùܵÀͨÐÅЧ¹û»áºÃЩ£¬¹²Ïí×ÊÔ´µÄ»°£¬ÐÔÄÜÌ«µÍ£¬³ö´í¸ÅÂʸߡ£
CODE£º
/**¶ÁÈ¡¹ÜµÀÖеÄÐÅÏ¢Ïß³Ì*/ public class ReaderThread implements Runnable { private PipedReader pr; private BufferedReader br; public ReaderThread() { super(); } public ReaderThread(PipedReader pr) { super(); this.pr = pr; //°ü×°¹ÜµÀÁ÷ this.br=new BufferedReader(pr); } public void run(){ String buffer=null; System.out.println(Thread.currentThread().getName()); try{ //¿ªÊ¼ÖðÐжÁÈ¡¹ÜµÀÁ÷Êý¾Ý£¨¼Ù¶¨¹ÜµÀÁ÷Êý¾Ýʱ×Ö·ûÁ÷£© System.out.println("------´òÓ¡¹ÜµÀÖеÄÊý¾Ý-------"); while((buffer=br.readLine())!=null){ System.out.println(buffer); } } catch(IOException e){ e.printStackTrace(); } finally{ try { if(br!=null) br.close(); } catch (IOException e) { e.printStackTrace(); } } } } |
/**Ïñ¹ÜµÀÁ÷ÖÐдÈëÊý¾Ý*/ public class WriterThread implements Runnable { //¶¨ÒåÒ»¸öÊý×éÀ´³äµ±Ïò¹ÜµÀÖÐÊäÈëÊý¾Ý String []str=new String[]{"1.www.csdn.netÂÛ̳","2.www.google.com¹È¸è",
"3.www.hibernate.orgHibernate","4.www.xiami.comϺÃ×"}; private PipedWriter pw; public WriterThread() { } public WriterThread(PipedWriter pw) { this.pw = pw; } public void run(){ System.out.println(Thread.currentThread().getName()); try{ //Ïò¹ÜµÀÁ÷ÖÐдÈëÊý¾Ý£¬ÒÔ¹©¶ÁÈ¡ for(int i=0;i<100;i++){ pw.write(str[i%4]+"\n"); } } catch(IOException e){ e.printStackTrace(); } finally{ try { if(pw!=null){ pw.close(); } }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } |
public class TestPiped { public static void main(String[] args) { PipedReader pr = null; PipedWriter pw = null; try { pw = new PipedWriter(); pr = new PipedReader(); // Á´½Ó¹ÜµÀ pr.connect(pw); new Thread(new ReaderThread(pr),"¶ÁÈ¡¹ÜµÀÏß³Ì").start(); new Thread(new WriterThread(pw),"дÈë¹ÜµÀÏß³Ì").start(); } catch (IOException e) { e.printStackTrace(); } } } ½á¹û£º ¶ÁÈ¡¹ÜµÀÏß³Ì ------´òÓ¡¹ÜµÀÖеÄÊý¾Ý------- дÈë¹ÜµÀÏß³Ì 1.www.csdn.netÂÛ̳ 2.www.google.com¹È¸è 3.www.hibernate.orgHibernate 4.www.xiami.comϺÃ× 1.www.csdn.netÂÛ̳ 2.www.google.com¹È¸è 3.www.hibernate.orgHibernate 4.www.xiami.comϺÃ× 1.www.csdn.netÂÛ̳ .....£¨Ò»¹²100Ìõ£© |
Áù.Ïß³Ì×飨ThreadGroup£©
1.Ïß³Ì×é½éÉÜ£º
Ïß³Ì×é¿ÉÒÔ¶ÔÒ»ÅúÏ߳̽øÐзÖÀà¹ÜÀí£¬JavaÒ²ÔÊÐí³ÌÐòÖ±½Ó¶ÔÏß³Ì×é½øÐпØÖÆ¡£¶ÔÏß³Ì×éµÄ¿ØÖÆÏ൱ÓÚͬʱ¿ØÖÆÕâÅúÏ̡߳£Óû§´´½¨µÄËùÓÐÏ̶߳¼ÊôÓÚÖ¸¶¨Ïß³Ì×飬Èç¹ûûÓÐÏÔʾָ¶¨Ïß³ÌÊôÓÚÄĸöÏß³Ì×飬ÄÇôÕâ¸öÏß³ÌÊôÓÚĬÈÏÏß³Ì×é¡£ÔÚĬÈÏÇé¿öÏ£¬×ÓÏ̺߳ʹ´½¨ËüµÄ¸¸Ï̴߳¦ÓÚͬһ¸öÏß³Ì×éÄÚ:ÀýÈçA´´½¨BỊ̈߳¬BûÓÐÖ¸¶¨Ïß³Ì×飬ÄÇôAºÍBÊôÓÚͬһ¸öÏß³Ì×é¡£
Ò»µ©Ä³¸öÏ̼߳ÓÈëµ½Ö¸¶¨Ïß³Ì×飬ÄÇô¸ÃÏ߳̾ÍÒ»Ö±ÊôÓÚ¸ÃÏß³Ì×飬ֱµ½¸ÃÏß³ÌËÀÍö£¬Ïß³ÌÔËÐÐÖÐ;²»ÄܸıäËüËùÊôµÄÏß³Ì×飨ÖÐ;²»ÄܸıäÏß³Ì×飬ËùÒÔThreadÀàÖ»ÓÐgetThreadGroup£¨£©·½·¨À´»ñµÃÏß³Ì×飬¶øÃ»ÓÐset·½·¨¡££©¡£
public final ThreadGroup getThreadGroup() { return group; } |
ThreadÀàÖй¹Ôì·½·¨£º
ÆäÖвÎÊýµÄ¸öÊý¸ù¾ÝÇé¿ö¶ø¶¨£¬initÖлá¸ù¾Ý²ÎÊý¸öÊý¶ø±ä£¬Ã»Õâ¸ö²ÎÊýµÄ¾ÍÖ±½Ónull
longÀàÐ;Í0.
public Thread(ThreadGroup group, Runnable target, String name, long stackSize) { init(group, target, name, stackSize); } |
ThreadGroupÀàÖеĹ¹Ôì·½·¨£º
//²»ÊôÓÚÈκÎÒ»¸öÏß³Ì×飬ÊÇÒ»¸ö±ØÐëµÄÓÃÀ´´´½¨ÏµÍ³Ï̵߳Ä×é /** * Creates an empty Thread group that is not in any Thread group. * This method is used to create the system Thread group. */ private ThreadGroup() { // called from C code this.name = "system"; this.maxPriority = Thread.MAX_PRIORITY; this.parent = null; } ------------------------------------------------------ private ThreadGroup(Void unused, ThreadGroup parent, String name) { this.name = name; this.maxPriority = parent.maxPriority; this.daemon = parent.daemon; this.vmAllowSuspension = parent.vmAllowSuspension; this.parent = parent; parent.add(this); } //Ö¸¶¨Ïß³Ì×éÃû´´½¨Ò»¸öÏß³Ì×é public ThreadGroup(String name) { this(Thread.currentThread().getThreadGroup(), name); } //Ö¸¶¨µÄ¸¸Ï̺߳ÍÏß³Ì×éÃûÀ´´´½¨Ò»¸öÏß³Ì×é public ThreadGroup(ThreadGroup parent, String name) { this(checkParentAccess(parent), parent, name); } |
¿´³öÉÏÃæÁ½¸öpublic¹¹ÔìÆ÷¶¼ÐèÒªÖ¸¶¨Ò»¸öÃû×Ö¸øÏß³Ì×飬ËùÒÔÏß³Ì×é×ÜÊǾßÓÐÒ»¸ö×Ö·û´®Ãû×Ö£¬¸ÃÃû³Æ¿Éµ÷ÓÃThreadGroupµÄgetName£¨£©»ñµÃ£¬µ«²»ÔÊÐí¸Ä±äÏß³Ì×éµÄÃû×Ö¡£

Ô´ÂësetMaxPriority£¨int pri£©
public final void setMaxPriority(int pri) { int ngroupsSnapshot; ThreadGroup[] groupsSnapshot; synchronized (this) { checkAccess(); if (pri < Thread.MIN_PRIORITY || pri > Thread.MAX_PRIORITY) { return; } maxPriority = (parent != null) ? Math.min(pri, parent.maxPriority) : pri; ngroupsSnapshot = ngroups; if (groups != null) { groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot); } else { groupsSnapshot = null; } } for (int i = 0 ; i < ngroupsSnapshot ; i++) { groupsSnapshot[i].setMaxPriority(pri); } } |
Àý×Ó£º
/**²âÊÔÏß³Ì×é*/ public class TestThread implements Runnable { //Ö¸¶¨Ïß³Ì×é @Override public void run() { for(int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"Ïß³Ì"+i+
"ÊôÓÚ"+Thread.currentThread().getThreadGroup().getName()+"Ïß³Ì×é"); } } } public class ThreadGroupTest { public static void main(String [] args){ //»ñÈ¡Ö÷Ï̵߳ÄÏß³Ì×é ThreadGroup mainGroup=Thread.currentThread().getThreadGroup(); System.out.println("Ö÷Ï̵߳Ä×éµÄÃû×Ö£º"+mainGroup.getName()); System.out.println("Ö÷Ïß³Ì×éÊÇ·ñÊôÓÚºǫ́Ïß³Ì×飺"+mainGroup.isDaemon()); //н¨Ò»¸öÏß³Ì×éÃû×ÖΪ¡°ÐÂÏß³Ì×顱£¬²»ÉèÖø¸Ïß³Ì×é ThreadGroup tg=new ThreadGroup("˽ÈË"); tg.setDaemon(true); System.out.println(tg.getName()+"ÊÇ·ñÊǺǫ́Ïß³Ì×é:"+tg.isDaemon()); Thread th=new Thread(tg,new TestThread(),"Ïß³Ì1"); System.out.println("1»î¶¯µÄÏß³ÌÓÐ"+tg.activeCount()); th.start(); Thread th1=new Thread(tg,new TestThread(),"Ïß³Ì2"); th1.start(); System.out.println("2»î¶¯µÄÏß³ÌÓÐ"+tg.activeCount()); //Thread t1=new Thread(); } } ½á¹û£º Ö÷Ï̵߳Ä×éµÄÃû×Ö£ºmain Ö÷Ïß³Ì×éÊÇ·ñÊôÓÚºǫ́Ïß³Ì×飺false ˽ÈËÊÇ·ñÊǺǫ́Ïß³Ì×é:true 1»î¶¯µÄÏß³ÌÓÐ0 2»î¶¯µÄÏß³ÌÓÐ2 Ïß³Ì1Ïß³Ì0ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì1Ïß³Ì1ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì2Ïß³Ì0ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì1Ïß³Ì2ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì2Ïß³Ì1ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì1Ïß³Ì3ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì2Ïß³Ì2ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì1Ïß³Ì4ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì2Ïß³Ì3ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì1Ïß³Ì5ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì2Ïß³Ì4ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì1Ïß³Ì6ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì2Ïß³Ì5ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì1Ïß³Ì7ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì2Ïß³Ì6ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì2Ïß³Ì7ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì2Ïß³Ì8ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì2Ïß³Ì9ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì1Ïß³Ì8ÊôÓÚ˽ÈËÏß³Ì×é Ïß³Ì1Ïß³Ì9ÊôÓÚ˽ÈËÏß³Ì×é |
2.Ïß³ÌÒì³£´¦Àí
²»ÏëÔÚ¶àÏß³ÌÖÐÓöµ½ÎÞνµÄException£¬´Ójdk1.5ºó£¬java¼ÓÇ¿ÁËÏ̵߳ÄÒì³£´¦Àí£¬Èç¹ûÏß³ÌÖ´Ðйý³ÌÖÐÅ׳öÁËÒ»¸öδ´¦ÀíµÄÒì³££¬JVMÔÚ½áÊø¸ÃÏß³Ì֮ǰ¾Í»á×Ô¶¯²éÕÒÊÇ·ñÓжÔÓ¦µÄThread.UncaughtExceptionHandler¶ÔÏó£¬Èç¹ûÕÒµ½¸Ã´¦Àí¶ÔÏ󣬽«»áµ÷ÓøöÔÏóµÄuncaughtException£¨Thread
t£¬Throwable e£©·½·¨À´´¦Àí¸ÃÒì³£¡£
×Ô¶¨ÒåÏß³ÌÒì³£ÐèÒª¼Ì³ÐThread.UncaughtExceptionHandler
ThreadÔ´Â룺
public interface UncaughtExceptionHandler { /** * Method invoked when the given thread terminates due to the * given uncaught exception. * <p class="artcon">Any exception thrown by this method will be ignored by the * Java Virtual Machine. * @param t the thread * @param e the exception */ void uncaughtException(Thread t, Throwable e); } |
ThreadÀàÖÐÌṩÁ½¸ö·½·¨À´ÉèÖÃÒì³£´¦ÀíÆ÷£º
1.static setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler
eh)
Ϊ¸ÃÏß³ÌÀàµÄËùÓÐÏß³ÌʵÀýÉèÖÃĬÈϵÄÒì³£´¦ÀíÆ÷
Ô´Â룺
Public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission( new RuntimePermission("setDefaultUncaughtExceptionHandler") ); } defaultUncaughtExceptionHandler = eh; } |
2.setUncaughtExceptionHandler(UncaughtExceptionHandler
eh)
Ϊָ¶¨Ïß³ÌʵÀýÉèÖÃÒì³£´¦ÀíÆ÷
Ô´Â룺
public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) { checkAccess(); uncaughtExceptionHandler = eh; } |
ÆäʵThreadGroupÀà¼Ì³ÐÁËThread.UncaughtExceptionHandler½Ó¿Ú£¬ËùÒÔÿ¸öÏß³ÌËùÊôµÄÏß³Ì×齫»á×÷ΪĬÈϵÄÒì³£´¦ÀíÆ÷¡£
ËùÒÔ¿ÉÒÔÈÏΪµ±Ò»¸öÏ̳߳öÏÖÒ쳣ʱ£¬JVMÊ×ÏÈ»áµ÷ÓøÃÏ̵߳ÄÒì³£´¦ÀíÆ÷£¨setUncaughtExceptionHandler£©,Èç¹ûÕÒµ½¾ÍÖ´ÐиÃÒì³£¡£Ã»ÕÒµ½¾Í»áµ÷ÓøÃÏß³ÌËùÊôÏß³Ì×éµÄÒì³£´¦ÀíÆ÷¡£
ThreadGroupÀàÖÐÒì³£´¦ÀíÆ÷
Ô´Â룺
public void uncaughtException(Thread t, Throwable e) { if (parent != null) { parent.uncaughtException(t, e); } else { Thread.UncaughtExceptionHandler ueh = Thread.getDefaultUncaughtExceptionHandler(); if (ueh != null) { ueh.uncaughtException(t, e); } else if (!(e instanceof ThreadDeath)) { System.err.print("Exception in thread \"" + t.getName() + "\" "); e.printStackTrace(System.err); } } } |
Àý×Ó£º
/** * ¶¨Òå×Ô¼ºµÄÒì³£Àà */ class MyEx implements Thread.UncaughtExceptionHandler{ @Override public void uncaughtException(Thread t, Throwable e) { System.out.println(t+"Ï̳߳öÏÖÁËÒì³££º"+e); } } /**ΪÖ÷Ïß³ÌÉèÖÃÒì³£´¦ÀíÆ÷,µ±³ÌÐò¿ªÊ¼ÔËÐÐʱÅ׳öδ´¦ÀíµÄÒì³££¬×Ô¶¨ÒåµÄÒì³£´¦ÀíÆ÷»áÆð×÷ÓÃ*/ class MyThread extends Thread{ public void run(){ int a=5/0; } } public class ExHandler { public static void main(String []args){ Thread td=new MyThread(); //Ϊָ¶¨µÄtdÏß³ÌʵÀýÉèÖÃÒì³£´¦ÀíÆ÷ td.setUncaughtExceptionHandler(new MyEx()); td.start(); //ÉèÖÃÖ÷Ï̵߳ÄÒì³£Àà Thread.currentThread().setUncaughtExceptionHandler(new MyEx()); byte [] b=new byte[2]; System.out.println(b[2]); } } ½á¹û£º Thread[main,5,main]Ï̳߳öÏÖÁËÒì³££ºjava.lang.ArrayIndexOutOfBoundsException: 2 Thread[Thread-0,5,main]Ï̳߳öÏÖÁËÒì³££ºjava.lang.ArithmeticException: / by zero |
Æß£®CallableºÍFuture½Ó¿Ú
C#¿ÉÒÔ°ÑÈÎÒâ·½·¨°ü×°³ÉÏß³ÌÖ´ÐÐÌ壬°üÀ¨ÄÇЩÓзµ»ØÖµµÄ·½·¨¡£JavaÒ²´Ójdk1.5¿ªÊ¼£¬¼ÓÈëÁËCallable½Ó¿ÚÓÃÀ´À©Õ¹Runnable½Ó¿ÚµÄ¹¦ÄÜ£¬Callable½Ó¿ÚÌṩһ¸öcall£¨£©À´ÔöÇ¿RunnableµÄrun()¡£ÒòΪcall£¨£©¿ÉÒÔÓзµ»ØÖµ£¬¿ÉÒÔÉùÃ÷Å׳öÒì³£¡£
µ«ÊÇCallableÊÇÐÂÔöµÄ½Ó¿Ú ²¢Ã»Óм̳ÐRunnable½Ó¿Ú£¬ÄÇô¿Ï¶¨²»ÄÜ×÷ΪRunnable
targetÀ´Ö±½Ó×÷ΪThread¹¹Ôì·½·¨µÄ²ÎÊý¡£±ØÐëÓÉÒ»¸öÖмäµÄÀàÀ´°ü×°Callable¶ÔÏó¡£Õâ¸öÀà¾ÍÊÇʵÏÖÁËFuture½Ó¿Ú£¨¼Ì³ÐÖÁRunnable½Ó¿Ú£©µÄFutureTaskÀà¡£
CODE£º
import java.util.concurrent.Callable; public class CallableThread implements Callable<Integer> { @Override public Integer call() throws Exception { int i=0; for(;i<6;i++){ System.out.println(Thread.currentThread().getName()+"Ñ»·£º"+i); } return i; } } ---------------------------------------------------------------------------- public class TestCallable { public static void main(String []args){ try { CallableThread ct=new CallableThread(); FutureTask<Integer> target=new FutureTask<Integer>(ct); for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+"Ñ»·±äÁ¿£º"+i); if(i==2){ new Thread(target,"×ÓÏß³Ì").start(); //boolean isDone£¨£©£ºÈç¹ûCallableÈÎÎñÒÑÍê³É£¬Ôò·µ»Øtrue£¬·ñÔò·µ»Øfalse System.out.println(target.isDone()); Thread.sleep(1); } } //V get():·µ»ØCallableÈÎÎñÀïcall£¨£©µÄ·µ»ØÖµ£¬µ÷Óø÷½·¨»áµ¼ÖÂ×èÈû,±ØÐëµÈµ½×ÓÏ߳̽áÊøÊ±²Å»áµÃµ½·µ»ØÖµ System.out.println("×Ó·µ»ØÖµÊÇ£º"+target.get()); System.out.println(target.isDone()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } } ----------- ½á¹û£º mainÑ»·±äÁ¿£º0 mainÑ»·±äÁ¿£º1 mainÑ»·±äÁ¿£º2 false ×ÓÏß³ÌÑ»·£º0 ×ÓÏß³ÌÑ»·£º1 ×ÓÏß³ÌÑ»·£º2 ×ÓÏß³ÌÑ»·£º3 ×ÓÏß³ÌÑ»·£º4 mainÑ»·±äÁ¿£º3 ×ÓÏß³ÌÑ»·£º5 mainÑ»·±äÁ¿£º4 ×Ó·µ»ØÖµÊÇ£º6 true |
°Ë£®Ï̳߳Ø
Jdk1.5ºójavaÒ²ÄÚÖÃÖ§³ÖÏ̳߳أ¬ÎªÁËÌá¸ßÐÔÄÜ¡££¨µ±³ÌÐòÖÐÐèÒª´´½¨´óÁ¿Éú´æÆÚºÜ¶ÌÔݵÄÏß³Ìʱ£¬¸üÓ¦¸Ã¿¼ÂÇʹÓÃÏ̳߳أ©
Jdk1.5Ìṩһ¸öExecutors¹¤³§ÀàÀ´²úÉúÏ̳߳ء£¹¤³§ÀàÖаüº¬5¸ö¾²Ì¬¹¤³§·½·¨À´´´½¨Ï̳߳أº
Ò».·µ»ØÀàÐÍÊÇExecutorService µÄ¹²3¸ö£º
1. newFixedThreadPool(int nThreads)
´´½¨Ò»¸ö¿ÉÖØÓõ쬾ßÓй̶¨Ïß³ÌÊýµÄÏ̳߳Ø
CODE£º
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } |
2. ExecutorService newCachedThreadPool()
´´½¨Ò»¸ö¾ßÓлº´æ¹¦ÄܵÄÏ̳߳أ¬ÏµÍ³¸ù¾ÝÐèÒª´´½¨Ị̈߳¬ÕâЩÏ߳̽«»á±»»º´æÔÚÏ̳߳ØÖС£
CODE£º
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } |
3.newSingleThreadExecutor()
´´½¨Ò»¸öÖ»Óе¥Ï̵߳ÄÏ̳߳أ¬µÈÓÚnewFixedThreadPool£¨1£©¡£
CODE£º
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); } |
¶þ.·µ»ØÀàÐÍÊÇScheduledExecutorService£¨ÊÇExecutorServiceµÄ×ÓÀࣩ
µÄ¹²2¸ö£º
1.newSingleThreadScheduledExecutor()
´´½¨Ö»ÓÐÒ»ÌõÏ̵߳ÄÏ̳߳أ¬Ëü¿ÉÒÔÔÚÖ¸¶¨ÑÓ³ÙºóÖ´ÐÐÏß³ÌÈÎÎñ
CODE£º
public static ScheduledExecutorService newSingleThreadScheduledExecutor() { return new DelegatedScheduledExecutorService (new ScheduledThreadPoolExecutor(1)); } |
2.newScheduledThreadPool(int corePoolSize)
´´½¨¾ßÓÐÖ¸¶¨Ïß³ÌÊýµÄÏ̳߳أ¬Ëü¿ÉÒÔÔÚÖ¸¶¨ÑÓ³ÙºóÖ´ÐÐÏß³ÌÈÎÎñ¡£ÆäÖвÎÊýÖ¸³ØÖÐËù±£´æµÄÏß³ÌÊý£¬¼´Ê¹Ïß³Ìʱ¿ÕÏеÄÒ²±»±£´æÔÚÏ̳߳ØÄÚ¡£
CODE£º
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); } |
ExecutorService´ú±í¾¡¿ìÖ´ÐÐÏ̵߳ÄÏ̳߳أ¨Ö»ÒªÏ̳߳ØÖÐÓпÕÏÐÏß³ÌÁ¢¼´Ö´ÐÐÏß³ÌÈÎÎñ£©£¬³ÌÐòÖ»ÐèÒª´«ÈëRunnable»òCallable¶ÔÏó¼´¿É¡£
ExecutorServiceÌṩÈý¸ö·½·¨À´Ö´ÐÐỊ̈߳º
1.Future<?>submit£¨Runnable target£©£ºRunnableÖÐrunÊÇûÓзµ»ØÖµµÄËùÒÔÖ´ÐÐÍê³Éºó·µ»Ønull£¬¿ÉÒÔµ÷ÓÃFutureµÄisDone£¨£©£¬isCanclled£¨£©À´Åжϵ±Ç°targetµÄÖ´ÐÐ״̬¡£
2.<T>Future<T>submit(Runnable
target,T result):ÒòΪRunnableÖÐrunÊÇûÓзµ»ØÖµ£¬ÕâÀïÏÔʾָ¶¨¸ÃRunnable¶ÔÏóÏß³ÌÖ´ÐÐÍê³É·µ»ØÒ»¸öÖµ£¬Õâ¸öÖµ¾ÍÊÇresult¡£
3.<T>Future<T>submit(Callable<T>
target):CallableÖеÄcallÊÇÓзµ»ØÖµµÄ
ScheduledExecutorServiceÌṩÒÔÏÂËĸö·½·¨£º
1.ScheduledFuture<V> schedule(Callable(V)
c,long delay,TimeUnit unit):Ö¸¶¨cÈÎÎñ½«ÔÚdelayÑÓ³ÙºóÖ´ÐС£
2.ScheduledFuture<?> shedule£¨Runnable
r,long delay,TimeUnit unit£©:Ö¸¶¨rÈÎÎñ½«ÔÚdelayÑÓ³ÙºóÖ´ÐС£
3.ScheduledFuture<?> scheduleAtFixedRate(Runnable
r,long initialDelay,long period,TimeUnit unit):Ö¸¶¨rÈÎÎñ½«ÔÚdelayÑÓ³ÙºóÖ´ÐУ¬¶øÇÒÒÔÉ趨µÄƵÂÊÖØ¸´Ö´ÐУ¨ÔÚinitialDelayºó¿ªÊ¼Ö´ÐУ¬È»ºó¿ªÊ¼ÒÀ´ÎÔÚinitialDelay+period,initialDelay+period*2...´¦Öظ´Ö´ÐУ©¡£
4.ScheduledFuture<?>scheduledWithFixedDelay(Runnable
r,long nitialDelay,long delay,TimeUnit unit£©£º´´½¨²¢Ö´ÐÐÒ»¸öÔÚ¸ø¶¨³õʼÑÓ³ÙºóÊ×´ÎÆôÓõ͍ÆÚ²Ù×÷£¬Ëæºó£¬ÔÚÿһ´ÎÖ´ÐÐÖÐÖ¹ºÍÏÂÒ»´ÎÖ´ÐпªÊ¼Ö®¼ä¶¼´æÔÚ¸ø¶¨µÄÑÓ³Ù¡£Èç¹ûÈÎÎñµÄÈÎÒâÒÀ´ÎÖ´ÐÐʱÒì³££¬¾Í»áÈ¡ÏûºóÐòÖ´ÐС£·ñÔò£¬Ö»ÄÜͨ¹ý³ÌÐòÀ´ÏÔʾȡÏû»òÖÐÖ¹¸ÃÈÎÎñ¡£
µ±ÓÃÍêÒ»¸öÏ̳߳غó£¬Ó¦¸Ãµ÷ÓøÃÏ̳߳صÄshutdown£¨£©·½·¨£¬ÆôÓÃÁËshutdown()·½·¨ºóÏ̳߳ز»ÔÙ½ÓÊÜÐÂÈÎÎñ£¬µ«»á½«ÒÔǰËùÓÐÒÑÌá½»µÄÈÎÎñÖ´ÐÐÍê³É,È»ºóÆô¶¯Ï̳߳صĹرÕÐòÁС£
µ±Ï̳߳ØËùÓÐÈÎÎñ¶¼Ö´ÐÐÍê³Éºó£¬³ØÖÐËùÓÐÏ̶߳¼»áËÀÍö£¬ÁíÍâÒ²¿ÉÒÔµ÷ÓÃÏ̳߳صÄshutdownNow£¨£©·½·¨À´¹Ø±ÕÏ̳߳أ¬¸Ã·½·¨ÊÔͼֹͣËùÓÐÕýÔÚÖ´ÐеĻÈÎÎñ£¬ÔÝÍ£´¦ÀíÕýÔڵȴýµÄÈÎÎñ£¬²¢·µ»ØµÈ´ýÖ´ÐеÄÈÎÎñÁÐ±í¡£
Àý×Ó£º
class TestThread implements Runnable{ public void run() { for(int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+":"+i); } } } public class ThreadPoolTest { public static void main(String []args){ //´´½¨Ò»¸ö¹Ì¶¨Ïß³ÌÊýΪ3µÄÏß³Ì³Ø ExecutorService pool=Executors.newFixedThreadPool(3); //ÏñÏ̳߳ØÌá½»10¸öÏß³Ì for(int i=0;i<10;i++){ pool.submit(new TestThread()); if(i==4){ } } //Ö´ÐÐÍê³Éºó¹Ø±ÕÏß³Ì pool.shutdown(); } } ½á¹û£º pool-1-thread-2:1 pool-1-thread-2:2 pool-1-thread-2:3 pool-1-thread-1:9 pool-1-thread-3:8 pool-1-thread-3:9 pool-1-thread-2:4 ...... |
¾Å£®¸½Â¼£ºÏß³ÌÏà¹ØµÄÀà
1.ThreadLocal(Ïֲ߳̾¿±äÁ¿)
ΪÁ˱ÜÃâ²¢·¢Ï̵߳ݲȫÎÊÌ⣬¿ÉÒÔÌí¼ÓÖ§³Ö·ºÐ͵ÄThreadLocalÀࣨThreadLocal<T>£©¡£Í¨¹ýʹÓÃThreadLocal¿ÉÒÔ¼ò»¯¶àÏ̱߳à³ÌʱµÄ²¢·¢·ÃÎÊ£¬Ê¹ÓÃÕâ¸ö¹¤¾ßÀà¿ÉÒԺܼò½àµÄд³öÓÐûµÄ¶àÏ̳߳ÌÐò£¨ÀýÈçHibernateµÄ¹Ù·½ÌṩHibernateUtilÀàÀïÉèÖõ±Ç°Ï̵߳ľֲ¿±äÁ¿Êǵ±Ç°Ï̸߳±±¾ÖÐsessionµÄÖµ£©£º
Hibernate´úÂ룺
public class HibernateUtil { /** ÈÕÖ¾ */ private static final Log LOG=LogFactory.getLog(HibernateUtil.class); /** Ï̱߳¾µØ±äÁ¿*/ private static final ThreadLocal MAP = new ThreadLocal(); /** »á»°¹¤³§ */ private static final SessionFactory SESSION_FACTORY; private HibernateUtil() { } static { try { LOG.debug("HibernateUtil.static - loading config"); SESSION_FACTORY = new Configuration().configure() .buildSessionFactory(); LOG.debug("HibernateUtil.static - end"); } catch (HibernateException e) { throw new RuntimeException("½¨Á¢»á»°¹¤³§´íÎó" + e.getMessage(), e); } } /** * »ñµÃÒ»¸ö»á»°´Óµ±Ç°µÄÏ̱߳äÁ¿£¬µ±Õâ¸öÈÎÎñÍê³Éºó£¬Óû§±ØÐë·µ»Ø»á»°¹Ø±Õ·½·¨ */ public static Session currentSession()throws HibernateException{ Session session=(Session)MAP.get(); //Èç¹û»á»°»¹Ã»ÓУ¬¾Í´ò¿ª»á»° if(session==null){ session=SESSION_FACTORY.openSession(); //ÉèÖôËÏֲ߳̾¿±äÁ¿µÄÖµÊǵ±Ç°Ï̸߳±±¾ÖÐsessionµÄÖµ MAP.set(session); } return session; } /** * ¹Ø±Õ»á»° */ public static void closeSession(){ Session session=(Session)MAP.get(); MAP.set(null); if(session!=null){ session.close(); } } } |
¸ù¾ÝÉÏÃæ´úÂëÀ´¿´£º
Ïֲ߳̾¿±äÁ¿¹¦Äܼܺòµ¥£¬¾ÍÊÇΪÿһ¸öʹÓøñäÁ¿µÄÏ̶߳¼Ìṩһ¸ö±äÁ¿ÖµµÄ¸±±¾£¬Ê¹Ã¿Ò»¸öÏ̶߳¼¿ÉÒÔ¶ÀÁ¢µØ¸Ä±ä×Ô¼ºµÄ¸±±¾£¬¶ø²»»áºÍÆäËûÏ̵߳ĸ±±¾³åÍ»¡£·Â·ð¾ÍºÃÏñÿһ¸öÏ̶߳¼¿ÉÒÔÍêȫӵÓиñäÁ¿
ThreadLocalÀàÌṩµÄ³£Ó÷½·¨£º
1.T get()£º·µ»Ø´ËÏֲ߳̾¿±äÁ¿Öе±Ç°Ï̸߳±±¾ÖеÄÖµ¡£
2.void remove()£ºÉ¾³ý´ËÏֲ߳̾¿±äÁ¿Öе±Ç°Ï̵߳ÄÖµ¡£
3.void set£¨T value£©£ºÉèÖôËÏֲ߳̾¿±äÁ¿Öе±Ç°Ï̸߳±±¾ÖеÄÖµ¡£
CODE£º
/** * Ïֲ߳̾¿±äÁ¿²âÊÔ * @author Cloudy * */ class Accout{ //¶¨ÒåÒ»¸öThreadLocal±äÁ¿£¬Ö»Òªµ÷ÓøÃÀàµÄÏ̶߳¼»á±£Áô¸Ã±äÁ¿µÄÒ»¸ö¸±±¾ private ThreadLocal<String> threadLocal=new ThreadLocal<String>(); //³õʼ»¯threadLocal public Accout(String str) { this.threadLocal.set(str); System.out.println("-------³õʼ»¯£¨ÎªThreadLocalÔÚmainÖи±±¾£©ÖµÊÇ£º"+this.threadLocal.get()); } public String getThreadLocal() { return threadLocal.get(); } public void setThreadLocal(String threadLocal) { this.threadLocal.set(threadLocal); } } /**¶¨ÒåÒ»¸öÏß³Ì*/ class MyThread implements Runnable{ //Ä£ÄâÒ»¸öAccout private Accout accout; public MyThread(Accout accout) { super(); this.accout = accout; } //Ïß³ÌÖ´ÐÐÌå public void run() { for(int i=0;i<3;i++){ if(i==2){ //ÉèÖôËÏֲ߳̾¿±äÁ¿µÄֵΪµ±Ç°Ïß³ÌÃû×Ö accout.setThreadLocal(Thread.currentThread().getName()); } System.out.println(i+"------"+Thread.currentThread().getName()+
"Ïֲ߳̾¿±äÁ¿¸±±¾Öµ£º"+accout.getThreadLocal()); } } } public class ThreadLocalVarTest { public static void main(String []args){ ExecutorService pool=Executors.newFixedThreadPool(3); //Æô¶¯ÈýÌõỊ̈߳¬¹«ÓÃͬһ¸öAccout Accout ac=new Accout("ThreadLocal±¾×ð"); /* * ËäÈ»AccoutÀàµÄÖ»ÓÐÒ»¸ö±äÁ¿ËùÒÔThreadLocalÀàÐ͵ıäÁ¿¾Íµ¼ÖÂÁËͬһ¸öAccout¶ÔÏó£¬ * µ±i=2ºó£¬½«»á¿´µ½3ÌõÏ̷߳ÃÎÊͬһ¸öac ¶ø¿´µ½²»Í¬µÄThreadLocalÖµ¡£ */ pool.submit(new MyThread(ac)); pool.submit(new MyThread(ac)); pool.submit(new MyThread(ac)); pool.shutdown(); } } |
½á¹û£º
-------³õʼ»¯£¨ÎªThreadLocalÔÚmainÖи±±¾£©ÖµÊÇ£ºThreadLocal±¾×ð
0------pool-1-thread-1Ïֲ߳̾¿±äÁ¿¸±±¾Öµ£ºnull
1------pool-1-thread-1Ïֲ߳̾¿±äÁ¿¸±±¾Öµ£ºnull
2------pool-1-thread-1Ïֲ߳̾¿±äÁ¿¸±±¾Öµ£ºpool-1-thread-1
0------pool-1-thread-2Ïֲ߳̾¿±äÁ¿¸±±¾Öµ£ºnull
1------pool-1-thread-2Ïֲ߳̾¿±äÁ¿¸±±¾Öµ£ºnull
2------pool-1-thread-2Ïֲ߳̾¿±äÁ¿¸±±¾Öµ£ºpool-1-thread-2
0------pool-1-thread-3Ïֲ߳̾¿±äÁ¿¸±±¾Öµ£ºnull
1------pool-1-thread-3Ïֲ߳̾¿±äÁ¿¸±±¾Öµ£ºnull
2------pool-1-thread-3Ïֲ߳̾¿±äÁ¿¸±±¾Öµ£ºpool-1-thread-3
×ܽ᣺
ThreadLocal²¢²»ÄÜ´úÌæÍ¬²½»úÖÆ£¬Á½ÕßÃæÏòµÄÎÊÌâÁìÓò²»Í¬£¬Í¬²½»úÖÆÊÇΪÁ˶à¸öÏß³Ìͬ²½¶ÔÏàͬ×ÊÔ´µÄ²¢·¢·ÃÎÊ£¬ÊǶà¸öÏß³ÌÖ®¼ä½øÐÐͨÐŵÄÓÐЧ·½Ê½¡£¶øThreadLocalÊǸôÀë¶à¸öÏ̵߳ÄÊý¾Ý¹²Ïí£¬¸ù±¾¾ÍûÓÐÔÚ¶à¸öÏß³ÌÖ®¼ä¹²Ïí×ÊÔ´£¬Ò²¾Í¸ü²»ÓöԶà¸öÏß³Ìͬ²½ÁË¡£
ËùÒÔ£ºÈç¹û½øÐжà¸öÏß³ÌÖ®¼ä¹²Ïí×ÊÔ´£¬´ïµ½Ïß³ÌÖ®¼äͨÐŹ¦ÄÜ£¬¾Íͬ²½¡£
Èç¹û½ö½öÐèÒª¸ôÀë¶à¸öÏß³ÌÖ®¼äµÄ¹²Ïí³åÍ»£¬¾ÍÊÇÓÃThreadLocal¡£
2.°ü×°Ï̲߳»°²È«µÄ¼¯ºÏ³ÉΪḬ̈߳²È«¼¯ºÏ
Java¼¯ºÏÖеÄArrayList£¬LinkedList£¬HashSet£¬TreeSet£¬HashMap¶¼ÊÇÏ̲߳»°²È«µÄ£¨Ï̲߳»°²È«¾ÍÊǵ±¶à¸öÏß³ÌÏëÕâЩ¼¯ºÏÖзÅÈëÒ»¸öÔªËØÊ±£¬¿ÉÄÜ»áÆÆ»µÕâЩ¼¯ºÏÊý¾ÝµÄÍêÕûÐÔ£©
ÈçºÎ½«ÉÏÃæµÄ¼¯ºÏÀà°ü×°³ÉḬ̈߳²È«µÄÄØ£¿

Àý×Ó£ºÊ¹ÓÃCollectionsµÄsynchronizedMap·½·¨½«Ò»¸öÆÕͨHashMap°ü×°³ÉḬ̈߳²È«µÄÀà
HashMap hm=Collections.synchronizedMap(new
Map());
Èç¹ûÐèÒª°üװij¸ö¼¯ºÏ³ÉḬ̈߳²È«¼¯ºÏ£¬ÔòÓ¦¸ÃÔÚ´´½¨Ö®ºóÁ¢¼´°ü×°ÈçÉÏ¡£
3.Ḭ̈߳²È«µÄ¼¯ºÏÀà
λÓÚjava.util.concurrent°üϵÄConcurrentHashMap¼¯ºÏºÍConcurrentLinkedQueue¼¯ºÏ¶¼Ö§³Ö²¢·¢·ÃÎÊ£¬·Ö±ð¶ÔÓ¦Ö§³Ö²¢·¢·ÃÎʵÄHashMapºÍQueue£¬ËüÃǶ¼¿ÉÒÔÖ§³Ö¶àÏ̲߳¢·¢Ð´·Ã£¬ÕâЩдÈëÏ̵߳ÄËùÓвÙ×÷¶¼ÊÇḬ̈߳²È«µÄ£¬µ«¶ÁÈ¡µÄ²Ù×÷²»±ØËø¶¨¡££¨ÎªÊ²Ã´£¿ÒòΪËã·¨
ÎÒÒ²¿´²»¶®£©
µ±¶à¸öÏ̹߳²Ïí·ÃÎÊÒ»¸ö¹«¹²¼¯ºÏʱ£¬Ê¹ÓÃConcurrentLinkedQueueÊÇÒ»¸öÇ¡µ±µÄÑ¡Ôñ£¬ÒòΪConcurrentLinkedQueue²»ÔÊÐíʹÓÃnullÔªËØ¡£ConcurrentLinkedQueueʵÏÖÁ˶àÏ̵߳ĸßЧ·ÃÎÊ£¬¶àÏ̷߳ÃÎÊConcurrentLinkedQueue¼¯ºÏʱ²»ÐèÒªµÈ´ý¡£
ConcurrentHashMapÖ§³Ö16Ìõ¶àÏ̲߳¢·¢Ð´Èë¡£
Óõü´úÆ÷·ÃÎÊÕâÁ½ÖÖ¿ÉÖ§³Ö¶àÏ̵߳ļ¯ºÏ¶øÑÔ£¬¸Ãµü´úÆ÷¿ÉÄܲ»·´Ó¦³ö´´½¨µü´úÆ÷Ö®ºóËù×öµÄÐ޸쬵«²»»áÅ׳öÒì³££¬¶øÈç¹ûCollection×÷Ϊ¶ÔÏ󣬵ü´úÆ÷´´½¨Ö®ºóÐ޸ģ¬Ôò»áÅ׳öConcurrentModificationException¡£
|