¡¡¡¡Ïß³Ì×é
¡¡¡¡Ïß³ÌÊDZ»¸ö±ð´´½¨µÄ£¬µ«¿ÉÒÔ½«ËüÃǹéÀൽÏß³Ì×éÖУ¬ÒÔ±ãÓÚµ÷ÊԺͼàÊÓ¡£Ö»ÄÜÔÚ´´½¨Ï̵߳Äͬʱ½«ËüÓëÒ»¸öÏß³Ì×éÏà¹ØÁª¡£ÔÚʹÓôóÁ¿Ï̵߳ijÌÐòÖУ¬Ê¹ÓÃÏß³Ì×é×éÖ¯Ï߳̿ÉÄܺÜÓаïÖú¡£¿ÉÒÔ½«ËüÃÇ¿´×÷ÊǼÆËã»úÉϵÄĿ¼ºÍÎļþ½á¹¹¡£
¡¡¡¡Ï̼߳䷢ÐÅ
¡¡¡¡µ±Ïß³ÌÔÚ¼ÌÐøÖ´ÐÐÇ°ÐèÒªµÈ´ýÒ»¸öÌõ¼þʱ£¬½öÓÐ synchronized ¹Ø¼ü×ÖÊDz»¹»µÄ¡£ËäÈ» synchronized ¹Ø¼ü×Ö×èÖ¹²¢·¢¸üÐÂÒ»¸ö¶ÔÏ󣬵«ËüûÓÐʵÏÖÏ̼߳䷢ÐÅ¡£Object ÀàΪ´ËÌṩÁËÈý¸öº¯Êý£ºwait()¡¢notify() ºÍ notifyAll()¡£ÒÔÈ«ÇòÆøºòÔ¤²â³ÌÐòΪÀý¡£ÕâЩ³ÌÐòͨ¹ý½«µØÇò·ÖΪÐí¶àµ¥Ôª£¬ÔÚÿ¸öÑ»·ÖУ¬Ã¿¸öµ¥ÔªµÄ¼ÆË㶼ÊǸôÀë½øÐеģ¬Ö±µ½ÕâЩֵÇ÷ÓÚÎȶ¨£¬È»ºóÏàÁÚµ¥ÔªÖ®¼ä¾Í»á½»»»Ò»Ð©Êý¾Ý¡£ËùÒÔ£¬´Ó±¾ÖÊÉϽ²£¬ÔÚÿ¸öÑ»·Öи÷¸öÏ̶߳¼±ØÐëµÈ´ýËùÓÐÏß³ÌÍê³É¸÷×ÔµÄÈÎÎñÒÔºó²ÅÄܽøÈëÏÂÒ»¸öÑ»·¡£Õâ¸öÄ£ÐͳÆΪ ÆÁ±Îͬ²½£¬ÏÂÀý˵Ã÷ÁËÕâ¸öÄ£ÐÍ£º
¡¡¡¡ÆÁ±Îͬ²½
public class BSync {
¡¡ int totalThreads;
¡¡ int currentThreads;
¡¡ public BSync(int x) {
¡¡¡¡ totalThreads = x;
¡¡¡¡ currentThreads = 0;
¡¡ }
¡¡ public synchronized void waitForAll() {
¡¡¡¡ currentThreads++;
¡¡¡¡ if(currentThreads < totalThreads) {
¡¡¡¡¡¡ try {
¡¡¡¡¡¡¡¡ wait();
¡¡¡¡¡¡ } catch (Exception e) {}
¡¡¡¡ }
¡¡¡¡ else {
¡¡¡¡¡¡ currentThreads = 0;
¡¡¡¡¡¡ notifyAll();
¡¡¡¡ }
¡¡ }
}
¡¡¡¡µ±¶ÔÒ»¸öÏ̵߳÷Óà wait() ʱ£¬¸ÃÏ߳̾ͱ»ÓÐЧ×èÈû£¬Ö»µ½ÁíÒ»¸öÏ̶߳Ôͬһ¸ö¶ÔÏóµ÷Óà notify() »ò notifyAll() Ϊֹ¡£Òò´Ë£¬ÔÚÇ°Ò»¸öʾÀýÖУ¬²»Í¬µÄÏß³ÌÔÚÍê³ÉËüÃǵŤ×÷ÒԺ󽫵÷Óà waitForAll() º¯Êý£¬×îºóÒ»¸öÏ߳̽«´¥·¢ notifyAll() º¯Êý£¬¸Ãº¯Êý½«ÊÍ·ÅËùÓеÄÏ̡߳£µÚÈý¸öº¯Êý notify() ֻ֪ͨһ¸öÕýÔڵȴýµÄỊ̈߳¬µ±¶Ôÿ´ÎÖ»ÄÜÓÉÒ»¸öÏß³ÌʹÓõÄ×ÊÔ´½øÐзÃÎÊÏÞÖÆʱ£¬Õâ¸öº¯ÊýºÜÓÐÓᣵ«ÊÇ£¬²»¿ÉÄÜÔ¤ÖªÄĸöÏ̻߳á»ñµÃÕâ¸ö֪ͨ£¬ÒòΪÕâÈ¡¾öÓÚ Java ÐéÄâ»ú (JVM) µ÷¶ÈËã·¨¡£
¡¡¡¡½« CPU ÈøøÁíÒ»¸öÏß³Ì
¡¡¡¡µ±Ï̷߳ÅÆúij¸öÏ¡ÓеÄ×ÊÔ´£¨ÈçÊý¾Ý¿âÁ¬½Ó»òÍøÂç¶Ë¿Ú£©Ê±£¬Ëü¿ÉÄܵ÷Óà yield() º¯ÊýÁÙʱ½µµÍ×Ô¼ºµÄÓÅÏȼ¶£¬ÒÔ±ãij¸öÆäËûÏß³ÌÄܹ»ÔËÐС£
¡¡¡¡ÊØ»¤Ïß³Ì
¡¡¡¡ÓÐÁ½ÀàỊ̈߳ºÓû§Ï̺߳ÍÊØ»¤Ï̡߳£Óû§Ïß³ÌÊÇÄÇЩÍê³ÉÓÐÓù¤×÷µÄÏ̡߳£ ÊØ»¤Ïß³ÌÊÇÄÇЩ½öÌṩ¸¨Öú¹¦ÄܵÄÏ̡߳£Thread ÀàÌṩÁË setDaemon() º¯Êý¡£Java ³ÌÐò½«ÔËÐе½ËùÓÐÓû§Ïß³ÌÖÕÖ¹£¬È»ºóËü½«ÆÆ»µËùÓеÄÊØ»¤Ï̡߳£ÔÚ Java ÐéÄâ»ú (JVM) ÖУ¬¼´Ê¹ÔÚ main ½áÊøÒÔºó£¬Èç¹ûÁíÒ»¸öÓû§Ïß³ÌÈÔÔÚÔËÐУ¬Ôò³ÌÐòÈÔÈ»¿ÉÒÔ¼ÌÐøÔËÐС£
¡¡¡¡±ÜÃâ²»ÌᳫʹÓõķ½·¨
¡¡¡¡²»ÌᳫʹÓõķ½·¨ÊÇΪ֧³ÖÏòºó¼æÈÝÐÔ¶ø±£ÁôµÄÄÇЩ·½·¨£¬ËüÃÇÔÚÒÔºóµÄ°æ±¾ÖпÉÄܳöÏÖ£¬Ò²¿ÉÄܲ»³öÏÖ¡£Java ¶àÏß³ÌÖ§³ÖÔÚ°æ±¾ 1.1 ºÍ°æ±¾ 1.2 ÖÐ×öÁËÖØ´óÐÞ¶©£¬stop()¡¢suspend() ºÍ resume() º¯ÊýÒѲ»ÌᳫʹÓá£ÕâЩº¯ÊýÔÚ JVM ÖпÉÄÜÒýÈë΢ÃîµÄ´íÎó¡£ËäÈ»º¯ÊýÃû¿ÉÄÜÌýÆðÀ´ºÜÓÕÈË£¬µ«ÇëµÖÖÆÓÕ»ó²»ÒªÊ¹ÓÃËüÃÇ¡£
¡¡¡¡µ÷ÊÔÏ̻߳¯µÄ³ÌÐò
¡¡¡¡ÔÚÏ̻߳¯µÄ³ÌÐòÖУ¬¿ÉÄÜ·¢ÉúµÄijЩ³£¼û¶øÌÖÑáµÄÇé¿öÊÇËÀËø¡¢»îËø¡¢ÄÚ´æË𻵺Í×ÊÔ´ºÄ¾¡¡£
¡¡¡¡ËÀËø
¡¡¡¡ËÀËø¿ÉÄÜÊǶàÏ̳߳ÌÐò×î³£¼ûµÄÎÊÌâ¡£µ±Ò»¸öÏß³ÌÐèÒªÒ»¸ö×ÊÔ´¶øÁíÒ»¸öÏ̳߳ÖÓиÃ×ÊÔ´µÄËøʱ£¬¾Í»á·¢ÉúËÀËø¡£ÕâÖÖÇé¿öͨ³£ºÜÄѼì²â¡£µ«ÊÇ£¬½â¾ö·½°¸È´Ï൱ºÃ£ºÔÚËùÓеÄÏß³ÌÖа´ÏàͬµÄ´ÎÐò»ñÈ¡ËùÓÐ×ÊÔ´Ëø¡£ÀýÈ磬Èç¹ûÓÐËĸö×ÊÔ´ ?A¡¢B¡¢C ºÍ D ? ²¢ÇÒÒ»¸öÏ߳̿ÉÄÜÒª»ñÈ¡Ëĸö×ÊÔ´ÖÐÈκÎÒ»¸ö×ÊÔ´µÄËø£¬ÔòÇëÈ·±£ÔÚ»ñÈ¡¶Ô B µÄËø֮ǰÊ×ÏÈ»ñÈ¡¶Ô A µÄËø£¬ÒÀ´ËÀàÍÆ¡£Èç¹û¡°Ïß³Ì 1¡±Ï£Íû»ñÈ¡¶Ô B ºÍ C µÄËø£¬¶ø¡°Ïß³Ì 2¡±»ñÈ¡ÁË A¡¢C ºÍ D µÄËø£¬ÔòÕâÒ»¼¼Êõ¿ÉÄܵ¼ÖÂ×èÈû£¬µ«ËüÓÀÔ¶²»»áÔÚÕâËĸöËøÉÏÔì³ÉËÀËø¡£
¡¡¡¡»îËø
¡¡¡¡µ±Ò»¸öÏß³ÌæÓÚ½ÓÊÜÐÂÈÎÎñÒÔÖÂËüÓÀԶûÓлú»áÍê³ÉÈκÎÈÎÎñʱ£¬¾Í»á·¢Éú»îËø¡£Õâ¸öÏß³Ì×îÖÕ½«³¬³ö»º³åÇø²¢µ¼Ö³ÌÐò±ÀÀ£¡£ÊÔÏëÒ»¸öÃØÊéÐèҪ¼ÈëÒ»·âÐÅ£¬µ«ËýÒ»Ö±ÔÚæÓڽӵ绰£¬ËùÒÔÕâ·âÐÅÓÀÔ¶²»»á±»Â¼Èë¡£ ÄÚ´æËð»µ
¡¡¡¡Èç¹ûÃ÷ÖǵØʹÓà synchronized ¹Ø¼ü×Ö£¬ÔòÍêÈ«¿ÉÒÔ±ÜÃâÄÚ´æ´íÎóÕâÖÖÆøËÀÈ˵ÄÎÊÌâ¡£
¡¡¡¡×ÊÔ´ºÄ¾¡
¡¡¡¡Ä³Ð©ÏµÍ³×ÊÔ´ÊÇÓÐÏ޵ģ¬ÈçÎļþÃèÊö·û¡£¶àÏ̳߳ÌÐò¿ÉÄܺľ¡×ÊÔ´£¬ÒòΪÿ¸öÏ̶߳¼¿ÉÄÜÏ£ÍûÓÐÒ»¸öÕâÑùµÄ×ÊÔ´¡£Èç¹ûÏß³ÌÊýÏ൱´ó£¬»òÕßij¸ö×ÊÔ´µÄºîÑ¡Ïß³ÌÊýÔ¶Ô¶³¬¹ýÁË¿ÉÓõÄ×ÊÔ´Êý£¬Ôò×îºÃʹÓà ×ÊÔ´³Ø¡£Ò»¸ö×îºÃµÄʾÀýÊÇÊý¾Ý¿âÁ¬½Ó³Ø¡£Ö»ÒªÏß³ÌÐèҪʹÓÃÒ»¸öÊý¾Ý¿âÁ¬½Ó£¬Ëü¾Í´Ó³ØÖÐÈ¡³öÒ»¸ö£¬Ê¹ÓÃÒÔºóÔÙ½«Ëü·µ»Ø³ØÖС£×ÊÔ´³ØÒ²³ÆΪ ×ÊÔ´¿â¡£
¡¡¡¡µ÷ÊÔ´óÁ¿µÄÏß³Ì
¡¡¡¡ÓÐʱһ¸ö³ÌÐòÒòΪÓдóÁ¿µÄÏß³ÌÔÚÔËÐжø¼«Äѵ÷ÊÔ¡£ÔÚÕâÖÖÇé¿öÏ£¬ÏÂÃæµÄÕâ¸öÀà¿ÉÄÜ»áÅÉÉÏÓ󡣺
public class Probe extends Thread {
¡¡ public Probe() {}
¡¡ public void run() {
¡¡¡¡ while(true) {
¡¡¡¡¡¡ Thread[] x = new Thread[100];
¡¡¡¡¡¡ Thread.enumerate(x);
¡¡¡¡¡¡ for(int i=0; i<100; i++) {
¡¡¡¡¡¡¡¡ Thread t = x[i];
¡¡¡¡¡¡¡¡ if(t == null)
¡¡¡¡¡¡¡¡¡¡ break;
¡¡¡¡¡¡¡¡ else
¡¡¡¡¡¡¡¡¡¡ System.out.println(t.getName() + "\t" + t.getPriority()+ "\t" + t.isAlive() + "\t" + t.isDaemon());
¡¡¡¡¡¡ }
¡¡¡¡ }
¡¡ }
}
¡¡¡¡ÏÞÖÆÏß³ÌÓÅÏȼ¶ºÍµ÷¶È
¡¡¡¡Java Ïß³ÌÄ£ÐÍÉæ¼°¿ÉÒÔ¶¯Ì¬¸ü¸ÄµÄÏß³ÌÓÅÏȼ¶¡£±¾ÖÊÉÏ£¬Ï̵߳ÄÓÅÏȼ¶ÊÇ´Ó 1 µ½ 10 Ö®¼äµÄÒ»¸öÊý×Ö£¬Êý×ÖÔ½´ó±íÃ÷ÈÎÎñÔ½½ô¼±¡£JVM ±ê×¼Ê×Ïȵ÷ÓÃÓÅÏȼ¶½Ï¸ßµÄỊ̈߳¬È»ºó²Åµ÷ÓÃÓÅÏȼ¶½ÏµÍµÄÏ̡߳£µ«ÊÇ£¬¸Ã±ê×¼¶Ô¾ßÓÐÏàͬÓÅÏȼ¶µÄÏ̵߳Ĵ¦ÀíÊÇËæ»úµÄ¡£ÈçºÎ´¦ÀíÕâЩÏß³ÌÈ¡¾öÓÚ»ù²ãµÄ²Ù×÷ϵͳ²ßÂÔ¡£ÔÚijЩÇé¿öÏ£¬ÓÅÏȼ¶ÏàͬµÄÏ̷߳ÖʱÔËÐУ»ÔÚÁíһЩÇé¿öÏ£¬Ï߳̽«Ò»Ö±ÔËÐе½½áÊø¡£Çë¼Çס£¬Java Ö§³Ö 10 ¸öÓÅÏȼ¶£¬»ù²ã²Ù×÷ϵͳ֧³ÖµÄÓÅÏȼ¶¿ÉÄÜÒªÉٵö࣬ÕâÑù»áÔì³ÉһЩ»ìÂÒ¡£Òò´Ë£¬Ö»Äܽ«ÓÅÏȼ¶×÷ΪһÖֺܴÖÂԵŤ¾ßʹÓá£×îºóµÄ¿ØÖÆ¿ÉÒÔͨ¹ýÃ÷ÖǵØʹÓà yield() º¯ÊýÀ´Íê³É¡£Í¨³£Çé¿öÏ£¬Çë²»ÒªÒÀ¿¿Ïß³ÌÓÅÏȼ¶À´¿ØÖÆÏ̵߳Ä״̬¡£
¡¡¡¡Ð¡½á
¡¡¡¡±¾ÎÄ˵Ã÷ÁËÔÚ Java ³ÌÐòÖÐÈçºÎʹÓÃÏ̡߳£ÏñÊÇ·ñÓ¦¸ÃʹÓÃÏß³ÌÕâÑùµÄ¸üÖØÒªµÄÎÊÌâÔںܴó³ÌÐòÉÏÈ¡¾öÓÚÊÖÍ·µÄÓ¦ÓóÌÐò¡£¾ö¶¨ÊÇ·ñÔÚÓ¦ÓóÌÐòÖÐʹÓöàÏ̵߳ÄÒ»ÖÖ·½·¨ÊÇ£¬¹À¼Æ¿ÉÒÔ²¢ÐÐÔËÐеĴúÂëÁ¿¡£²¢¼ÇסÒÔϼ¸µã£º
¡¡¡¡Ê¹ÓöàÏ̲߳»»áÔö¼Ó CPU µÄÄÜÁ¦¡£µ«ÊÇÈç¹ûʹÓà JVM µÄ±¾µØÏß³ÌʵÏÖ£¬Ôò²»Í¬µÄÏ߳̿ÉÒÔÔÚ²»Í¬µÄ´¦ÀíÆ÷ÉÏͬʱÔËÐУ¨ÔÚ¶à CPU µÄ»úÆ÷ÖУ©£¬´Ó¶øʹ¶à CPU »úÆ÷µÃµ½³ä·ÖÀûÓá£
¡¡¡¡Èç¹ûÓ¦ÓóÌÐòÊǼÆËãÃܼ¯Ð͵ģ¬²¢ÊÜ CPU ¹¦ÄܵÄÖÆÔ¼£¬ÔòÖ»Óжà CPU »úÆ÷Äܹ»´Ó¸ü¶àµÄÏß³ÌÖÐÊÜÒæ¡£
¡¡¡¡µ±Ó¦ÓóÌÐò±ØÐëµÈ´ý»ºÂýµÄ×ÊÔ´£¨ÈçÍøÂçÁ¬½Ó»òÊý¾Ý¿âÁ¬½Ó£©Ê±£¬»òÕßµ±Ó¦ÓóÌÐòÊǷǽ»»¥Ê½µÄʱ£¬¶àÏß³Ìͨ³£ÊÇÓÐÀûµÄ¡£
¡¡¡¡»ùÓÚ Internet µÄÈí¼þÓбØÒªÊǶàÏ̵߳ģ»·ñÔò£¬Óû§½«¸Ð¾õÓ¦ÓóÌÐò·´Ó³³Ù¶Û¡£ÀýÈ磬µ±¿ª·¢ÒªÖ§³Ö´óÁ¿¿Í»§»úµÄ·þÎñÆ÷ʱ£¬¶àÏ߳̿ÉÒÔʹ±à³Ì½ÏΪÈÝÒס£ÔÚÕâÖÖÇé¿öÏ£¬Ã¿¸öÏ߳̿ÉÒÔΪ²»Í¬µÄ¿Í»§»ò¿Í»§×é·þÎñ£¬´Ó¶øËõ¶ÌÁËÏìӦʱ¼ä¡£ ijЩ³ÌÐòÔ±¿ÉÄÜÔÚ C ºÍÆäËûÓïÑÔÖÐʹÓùýỊ̈߳¬ÔÚÄÇЩÓïÑÔÖжÔÏß³ÌûÓÐÓïÑÔÖ§³Ö¡£ÕâЩ³ÌÐòÔ±¿ÉÄÜͨ³£¶¼±»¸ãµÃ¶ÔÏß³ÌʧȥÁËÐÅÐÄ¡£