Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ºÚÂí³ÌÐòÔ±¡ª¡ªJava¶àÏß³Ì
 
×÷Õߣºtansuozhe1990 À´Ô´£ºCSDN ·¢²¼ÓÚ 2015-9-6
  2433  次浏览      27
 

Ò»¡¢Ê²Ã´ÊǶàỊ̈߳¿

ÒªÏëÃ÷°×ʲôÊǶàỊ̈߳¬¾ÍµÃÏÈÀí½âÏ̡߳£¶øÒªÀí½âỊ̈߳¬¾ÍÐèҪѧϰ½ø³Ì£¬ÏÂÃæ½«·Ö±ð½²½â½ø³Ì¡¢Ï̵߳ĸÅÄ×îºóÒý³ö¶àÏ̵߳ĸÅÄî¡£

1.½ø³Ì

½ø³ÌÊÇÒ»¸ö¾ßÓÐÒ»¶¨¶ÀÁ¢¹¦ÄܵijÌÐò¹ØÓÚij¸öÊý¾Ý¼¯ºÏµÄÒ»´ÎÔËÐл¡£ËüÊDzÙ×÷ϵͳ¶¯Ì¬Ö´ÐеĻù±¾µ¥Ôª£¬ÔÚ´«Í³µÄ²Ù×÷ϵͳÖУ¬½ø³Ì¼ÈÊÇ»ù±¾µÄ·ÖÅäµ¥Ôª£¬Ò²ÊÇ»ù±¾µÄÖ´Ðе¥Ôª¡£³ÌÐòÊÇÒ»¸öûÓÐÉúÃüµÄʵÌ壬ֻÓд¦ÀíÆ÷¸³Óè³ÌÐòÉúÃüʱ£¨²Ù×÷ϵͳִÐÐÖ®£©£¬Ëü²ÅÄܳÉΪһ¸ö»î¶¯µÄʵÌ壬ÎÒÃÇ³ÆÆäΪ½ø³Ì¡£

ͨË×µÄÀí½â£¬½ø³Ì¾ÍÊÇÒ»¸öÕýÔÚÖ´ÐеijÌÐò£¬Ã¿¸ö½ø³Ì¶¼´æÔÚÒ»¸öÖ´ÐÐ˳Ðò£¬¸ÃÖ´ÐÐ˳ÐòÒ²³ÆÖ´Ðз¾¶»òÖ´Ðе¥Ôª¡£

2.Ïß³Ì

Ïß³ÌÊǽø³ÌÄÚÒ»¸öÏà¶Ô¶ÀÁ¢µÄ¡¢¿Éµ÷¶ÈµÄÖ´Ðе¥Ôª¡£Ïß³ÌÔÚ¿ØÖÆ×Žø³ÌµÄÖ´ÐУ¬Ö»Òª½ø³ÌÖÐÓÐÒ»¸öÏß³ÌÔÚÖ´ÐУ¬½ø³Ì¾Í²»»á½áÊø¡£Ò»¸ö½ø³ÌÖÐÖÁÉÙ´æÔÚÒ»¸öÏ̡߳£

3.¶àÏß³Ì

Á˽âÁËÏ̵߳ĸÅÄ¾Í²»ÄÜÀí½â¶àÏß³ÌÁË¡£µ±ÔÚµ¥¸ö³ÌÐòÖÐͬʱÔËÐжà¸öÏß³ÌÒÔÍê³É²»Í¬ÈÎÎñµÄ¹¤×÷·½Ê½£¬¾Í³ÆÎª¶àÏ̡߳£

ÀýÈ磬ÔÚjavaÐéÄâ»úÔËÐÐʱ»áÆô¶¯Ò»¸öjava.exeµÄÖ´ÐгÌÐò£¬¸ÃÕýÔÚÔËÐеÄÖ´ÐгÌÐò¾Í½Ð½ø³Ì¡£¸Ã½ø³ÌÖÐÖÁÉÙÓÐÒ»¸öÏ̸߳ºÔðjava³ÌÐòµÄÖ´ÐУ¬¶øÇÒÕâ¸öÏß³ÌÔËÐеĴúÂë´æÔÚÓÚmain·½·¨ÖУ¬¸ÃÏ̱߳»³ÆÖ®ÎªÖ÷Ï̡߳£µ«JVMÔËÐÐʱ²¢²»ÊÇÖ»Æô¶¯Ò»¸öÖ÷Ị̈߳¬»¹ÓиºÔðÀ¬»ø»ØÊÕ»úÖÆµÄÏ̡߳£ÏñÕâÖÖÔÚÒ»¸ö½ø³ÌÖÐÓжà¸öÏß³ÌͬʱִÐеķ½Ê½£¬¾Í¿ÉÒÔÀí½âΪ¶àÏ̡߳£

¶þ¡¢¶àÏß³ÌÓÐÄÄЩ×÷Óã¿

1.³ä·ÖÀûÓÃCPU×ÊÔ´

ÏÖÔÚÊÀ½çÉÏ´ó¶àÊý¼ÆËã»úÖ»ÓÐÒ»¿éCPU¡£Òò´Ë£¬³ä·ÖÀûÓÃCPU×ÊÔ´ÏÔµÃÓÈÎªÖØÒª¡£µ±Ö´Ðе¥Ï̳߳ÌÐòʱ£¬ÓÉÓÚÔÚ³ÌÐò·¢Éú×èÈûʱCPU¿ÉÄܻᴦÓÚ¿ÕÏÐ״̬¡£Õ⽫Ôì³É´óÁ¿µÄ¼ÆËã×ÊÔ´µÄÀË·Ñ¡£¶øÔÚ³ÌÐòÖÐʹÓöàÏ߳̿ÉÒÔÔÚijһ¸öÏ̴߳¦ÓÚÐÝÃß»ò×èÈûʱ£¬¶øCPUÓÖÇ¡ºÃ´¦ÓÚ¿ÕÏÐ״̬ʱÀ´ÔËÐÐÆäËûµÄÏ̡߳£ÕâÑùCPU¾ÍºÜÄÑÓпÕÏеÄʱºò¡£Òò´Ë£¬CPU×ÊÔ´¾ÍµÃµ½Á˳ä·ÖµØÀûÓá£

2.¼ò»¯±à³ÌÄ£ÐÍ

Èç¹û³ÌÐòÖ»Íê³ÉÒ»ÏîÈÎÎñ£¬ÄÇֻҪдһ¸öµ¥Ï̵߳ijÌÐò£¬²¢ÇÒ°´×ÅÖ´ÐÐÕâ¸öÈÎÎñµÄ²½Öè±àд´úÂë¼´¿É¡£µ«ÒªÍê³É¶àÏîÈÎÎñ£¬Èç¹û»¹Ê¹Óõ¥Ï̵߳ϰ£¬ÄǾ͵ÃÔÚÔÚ³ÌÐòÖÐÅжÏÿÏîÈÎÎñÊÇ·ñÓ¦¸ÃÖ´ÐÐÒÔ¼°Ê²Ã´Ê±ºòÖ´ÐС£ÈçÏÔʾһ¸öʱÖÓµÄʱ¡¢·Ö¡¢ÃëÈý¸öÖ¸Õ롣ʹÓõ¥Ï߳̾͵ÃÔÚÑ­»·ÖÐÖðÒ»ÅжÏÕâÈý¸öÖ¸ÕëµÄת¶¯Ê±¼äºÍ½Ç¶È¡£Èç¹ûʹÓÃÈý¸öÏ̷߳ÖÁíÀ´´¦ÀíÕâÈý¸öÖ¸ÕëµÄÏÔʾ£¬ÄÇô¶ÔÓÚÿ¸öÏß³ÌÀ´Ëµ¾ÍÊÇÖ¸ÐÐÒ»¸öµ¥¶ÀµÄÈÎÎñ¡£ÕâÑùÓÐÖúÓÚ¿ª·¢ÈËÔ±¶Ô³ÌÐòµÄÀí½âºÍά»¤¡£

3.¼ò»¯Ò첽ʼþµÄ´¦Àí

µ±Ò»¸ö·þÎñÆ÷Ó¦ÓóÌÐòÔÚ½ÓÊÕ²»Í¬µÄ¿Í»§¶ËÁ¬½Óʱ×î¼òµ¥µØ´¦Àí·½·¨¾ÍÊÇΪÿһ¸ö¿Í»§¶ËÁ¬½Ó½¨Á¢Ò»¸öÏ̡߳£È»ºó¼àÌýÏß³ÌÈÔÈ»¸ºÔð¼àÌýÀ´×Ô¿Í»§¶ËµÄÇëÇó¡£Èç¹ûÕâÖÖÓ¦ÓóÌÐò²ÉÓõ¥Ïß³ÌÀ´´¦Àí£¬µ±¼àÌýÏ߳̽ÓÊÕµ½Ò»¸ö¿Í»§¶ËÇëÇóºó£¬¿ªÊ¼¶ÁÈ¡¿Í»§¶Ë·¢À´µÄÊý¾Ý£¬ÔÚ¶ÁÍêÊý¾Ýºó£¬read·½·¨´¦ÓÚ×èÈû״̬£¬Ò²¾ÍÊÇ˵£¬Õâ¸öÏ߳̽«ÎÞ·¨ÔÙ¼àÌý¿Í»§¶ËÇëÇóÁË¡£¶øÒªÏëÔÚµ¥Ïß³ÌÖд¦Àí¶à¸ö¿Í»§¶ËÇëÇ󣬾ͱØÐëʹÓ÷Ç×èÈûµÄSocketÁ¬½ÓºÍÒì²½I/O.µ«Ê¹ÓÃÒì²½I/O·½Ê½±ÈʹÓÃͬ²½I/O¸üÄÑÒÔ¿ØÖÆ£¬Ò²¸üÈÝÒ׳ö´í¡£Òò´Ë£¬Ê¹ÓöàÏ̺߳Íͬ²½I/O¿ÉÒÔ¸üÈÝÒ׵ش¦ÀíÀàËÆÓÚ¶àÇëÇóµÄÒ첽ʼþ¡£

4.ʹGUI¸üÓÐЧÂÊ

ʹÓõ¥Ïß³ÌÀ´´¦ÀíGUIʼþʱ£¬±ØÐëʹÓÃÑ­»·À´¶ÔËæÊ±¿ÉÄÜ·¢ÉúµÄGUIʼþ½øÐÐɨÃ裬ÔÚÑ­»·ÄÚ²¿³ýÁËɨÃèGUIʼþÍ⣬»¹µÃÀ´Ö´ÐÐÆäËûµÄ³ÌÐò´úÂë¡£Èç¹ûÕâЩ´úÂëÌ«³¤£¬ÄÇôGUIʼþ¾Í»á±»¡°¶³½á¡±£¬Ö±µ½ÕâЩ´úÂë±»Ö´ÐÐÍêΪֹ¡£ÔÚÏÖ´úµÄGUI¿ò¼Ü£¨ÈçSWING¡¢AWTºÍSWT£©Öж¼Ê¹ÓÃÁËÒ»¸öµ¥¶ÀµÄʼþ·ÖÅÉỊ̈߳¨EDT£©À´¶ÔGUIʼþ½øÐÐɨÃè¡£µ±ÎÒÃǰ´ÏÂÒ»¸ö°´Å¥Ê±£¬°´Å¥µÄµ¥»÷ʼþº¯Êý»áÔÚÕâ¸öʼþ·ÖÅÉÏß³ÌÖб»µ÷Óá£ÓÉÓÚEDTµÄÈÎÎñÖ»ÊǶÔGUIʼþ½øÐÐɨÃ裬Òò´Ë£¬ÕâÖÖ·½Ê½¶ÔʼþµÄ·´Ó³ÊǷdz£¿ìµÄ¡£

Èý¡¢´´½¨Ïß³Ì

ͨ¹ý²éÕÒAPIÎĵµ£¬·¢ÏÖÄܹ»½¨Á¢Ï̵߳ÄÀàÖ»ÓÐThreadÀ࣬µ«ÊÇ´´½¨Ïß³ÌÓÐÁ½ÖÖ·½Ê½£º

1.¼Ì³ÐThreadÀà

ÓÉÓÚThreadÀàÄܹ»Ö±½Ó½¨Á¢Ị̈߳¬Ò²¾ÍÊÇ˵ThreadÀàÀïÓн¨Á¢Ï̵߳ķ½·¨£¬Òò´Ë¿Éͨ¹ý¼Ì³ÐThreadÀ༴¿É»ñÈ¡´´½¨Ï̵߳ķ½·¨¡£´´½¨Ï̵߳IJ½ÖèÈçÏ£º

a£©×Ô¶¨ÒåÒ»¸öÀಢ¼Ì³ÐThreadÀà¡£

b£©¸´Ð´ThreadÀàµÄrun()·½·¨¡£Ä¿µÄ£ºrun()·½·¨ÊÇ´æ·ÅËù´´½¨Ïß³ÌÒªÖ´ÐеĴúÂ룬ÀàËÆmain()º¯Êý£¬Èç¹ûÐèÒª×Ô¶¨ÒåÔËÐдúÂ룬ÄÇô¾Í±ØÐ븲¸ÇThreadÀàµÄrun()·½·¨¡£

c£©Í¨¹ýnewµÄ·½Ê½´´½¨×Ô¶¨ÒåÏß³ÌÀàµÄ¾ßÌåʵÀý¶ÔÏó£¬ÕâÑù²ÅÕæÕý½¨Á¢ÁËÒ»¸öÏ̡߳£

d£©µ÷ÓøöÔÏóµÄstart()·½·¨£¬ÒÔÆô¶¯Ï̡߳£Ä¿µÄ£ºÈÃÏß³ÌÔËÐÐÆðÀ´£¬²¢Ö´ÐÐrun()·½·¨ÖеĴúÂë¡£

×¢£º²»¿ÉÖ±½ÓÖ±½Óµ÷ÓÃrun()·½·¨£¬·ñÔòÏ̲߳»»á±»Æô¶¯£¬±ØÐëͨ¹ýµ÷ÓöÔÏóµÄstart()·½·¨À´Æô¶¯Ï̲߳¢Ö´ÐÐrun()·½·¨¡£

´úÂëʾÀý£º´´½¨Ò»¸öỊ̈߳¬²¢ÓëÖ÷º¯Êý½øÐн»Ìæ´òÓ¡Êä³ö

//¶¨ÒåÒ»¸öÀàTestDemo£¬²¢¼Ì³ÐThreadÀà  
class TestDemo extends Thread
{
TestDemo(String name)
{
//µ÷Óø¸ÀàµÄ¹¹Ô캯Êý³õʼ»¯
super(name);
}

//¸´Ð´run()·½·¨
public void run()
{
for (int i=0;i<10;i++ )
{
System.out.println(Thread.currentThread().getName()+"---one run");
}
}
}

class ThreadTest
{
public static void main(String[] args)
{
//½¨Á¢TestDemoµÄ¶ÔÏó
TestDemo td=new TestDemo("one");
//µôÓöÔÏóµÄstart()·½·¨£¬Æô¶¯Ị̈߳¬²¢Ö´ÐÐrun()·½·¨ÖеĴúÂë
td.start();

for (int i=0;i<10 ;i++ )
{
System.out.println(Thread.currentThread().getName()+"------main run");
}
}
}

³ÌÐòµÄÔËÐкóµÄÊä³ö½á¹ûÈçÏÂͼ£º

×¢£ºÃ¿´Î³ÌÐòÔËÐкóµÄ½á¹û¶¼»áÓÐËù²»Í¬£¬ÒòΪÿ¸öÏß³ÌÊÇ·ñ±»cpuÖ´ÐÐÊÇËæ»úµÄ£¬Ò²¾ÍÊÇÿ¸öÏß³ÌÊÇ·ñÇÀµ½cpuÖ´ÐÐȨÊDz»È·¶¨µÄ£¬Òò´ËÔËÐнá¹û»á´æÔںܴó²îÒì¡£

2.ʵÏÖRunnable½Ó¿Ú

ÓÉÓÚjavaÖ»Ö§³Öµ¥¼Ì³Ð¶àʵÏÖµÄÌØÐÔ£¬Ö±½Ó¼Ì³ÐThreadÀà»á´æÔÚµÄÒ»¶¨¾ÖÏÞÐÔ£¬Òò´ËThreadÀ໹ÌṩÁË´´½¨Ï̵߳ÄÁíÒ»ÖÖ·½Ê½£¬¾ÍÊǸøThreadÀàÔö¼ÓÁËÒ»¸ö¿ÉÒÔ´«µÝRunnable½Ó¿ÚµÄ¹¹Ô캯Êý£¬×Ô¶¨ÒåÀàÖ»ÐèʵÏÖRunnable½Ó¿Ú²¢¸´Ð´ÆäÖеÄrun()·½·¨¼´¿É¡£ÊµÏÖ·½Ê½¿ÉÒÔÈÃ×Ô¶¨ÒåÏ̵߳ÄÔËÐдúÂëµ¥¶À´æ·ÅÔÚÒ»¸öÀàÖУ¬¿ÉÖ±½Ó±ÜÃâ¼Ì³Ð·½Ê½µÄ²»×ã¡£

´´½¨Ï̵߳IJ½ÖèÈçÏ£º

a£©×Ô¶¨ÒåÒ»¸öÀಢʵÏÖRunnable½Ó¿Ú¡£

b£©¸´Ð´Runnable½Ó¿ÚµÄrun()·½·¨¡£Ä¿µÄ£ºÈÃËù´´½¨µÄÏß³ÌÔËÐÐ×Ô¶¨ÒåµÄ´úÂë¡£

c£©´´½¨Ò»¸ö×Ô¶¨ÒåÀàµÄʵÀý¶ÔÏó¡£

d£©½¨Á¢Ò»¸öThread¶ÔÏ󣬲¢½«´´½¨µÄ×Ô¶¨ÒåÀàµÄ¶ÔÏó×÷Ϊʵ¼Ê²ÎÊý´«µÝ¸øThread¹¹Ô캯Êý¡£

e£©µ÷ÓÃThreadÀàÖеÄstart()·½·¨¡£Ä¿µÄ£ºÆô¶¯Ëù´´½¨µÄỊ̈߳¬²¢Ö´ÐÐ×Ô¶¨ÒåÀàÖеÄrun()·½·¨ÖеĴúÂë¡£

³ÌÐòʾÀý£º´´½¨Ò»¸öỊ̈߳¬²¢ÓëÖ÷º¯Êý½øÐн»Ìæ´òÓ¡Êä³ö

//¶¨ÒåÒ»¸öÀàTestDemo£¬²¢ÊµÏÖRunnable½Ó¿Ú  
class TestDemo implements Runnable
{
private String name;

//³õʼ»¯¶ÔÏóµÄname
TestDemo(String name)
{
this.name=name;
}

//¸´Ð´run()·½·¨
public void run()
{
for (int i=0; i<10;i++ )
{
System.out.println(this.getName()+"---one run");
}
}
//·µ»Øµ±Ç°Ï̵߳Äname
String getName()
{
return name;
}
}
class RunnableTestDemo
{
public static void main(String[] args)
{

//´´½¨Ò»¸öTestDemoÀà¶ÔÏó
TestDemo td=new TestDemo("one");
//½¨Á¢Ò»¸öÏ̶߳ÔÏó
Thread t=new Thread(td);
//Æô¶¯Ị̈߳¬²¢Ö´ÐÐTestDemo¶ÔÏóµÄrun()·½·¨
t.start();

for (int i=0;i<10 ;i++ )
{
System.out.println(Thread.currentThread().getName()+"------main run");
}
}
}

³ÌÐòÔËÐкóµÄ½á¹ûÈçÏÂͼ£º

3.Á½ÖÖ·½Ê½µÄÀû±×

¼Ì³Ð·½Ê½£ººÃ´¦ÊÇ¿ÉÒÔ¸²¸ÇThreadÀàµÄÆäËü·½·¨£¬ÒÔ¶ÔÀà½øÐмÓÇ¿£¬¶ø±×¶ËÊǾßÓе¥¼Ì³ÐµÄ¾ÖÏÞÐÔ¡£

ʵÏÖ·½Ê½£ººÃ´¦ÊDZÜÃâÁ˵¥¼Ì³ÐµÄ¾ÖÏÞÐÔ£¬¿ÉÒÔʵÏÖ×ÊÔ´µÄ¹²Ïí£¬±×¶Ë²»ÄÜͬʱ¸²¸ÇThreadÀàµÄÆäËü·½·¨¡£

4.ÎÊÌâ˼¿¼

ΪʲôÆô¶¯¶àÏß³ÌÒ»¶¨ÒªÓÃstart()·½·¨£¿

ͨ¹ý²éÕÒÔÚJDKµÄ°²×°Â·¾¶ÏµÄjavaÔ´³ÌÐò£¬·¢ÏÖThreadÖеÄstart()·½·¨¶¨ÒåÖÐʹÓÃÁËprivate native void start0()£¬¶ønative¹Ø¼ü×Ö±íʾµ÷ÓòÙ×÷ϵͳµÄµ×²ãº¯Êý£¬Ò²¾ÍÊÇ˵ÔÚstart()·½·¨Öе÷ÓÃÁ˲Ù×÷ϵͳµÄµ×²ãº¯Êý£¬Òò´ËÒ²¾Í¿ÉÒÔÃ÷°×ÓÃstart()·½·¨Æô¶¯Ï̵߳ÄÔ­ÒòÁË¡£

ËÄ¡¢¶àÏ̵߳ݲȫÎÊÌâ

1.ʲôÊǶàÏ̵߳ݲȫÎÊÌ⣿

µ±¶à¸öÏß³Ìͬʱ²Ù×÷¹²ÏíÊý¾Ýʱ£¬ÓÉÓÚcpuÖ´ÐÐÿ¸öÏ̵߳IJ»È·¶¨ÐÔ£¬¿ÉÄܵ¼ÖÂÒ»¸öÏ̶߳ԶàÌõÓï¾äÖ»Ö´ÐÐÁËÒ»²¿·Ö£¬»¹Ã»ÓÐÖ´ÐÐÍ꣬ÁíÒ»¸öÏ߳̾ͲÎÓë½øÀ´Ö´ÐУ¬µ¼Ö¹²ÏíÊý¾ÝµÄ´íÎó£¬Õâ¾ÍÊǶàÏ̵߳ݲȫÎÊÌâ¡£

´úÂëʾÀý£º¿ªÆôÈý¸öÏß³ÌͬʱÂôÍê20ÕÅÆ±£¬²»ÄܳöÏÖÖØÆ±ÏÖÏó¡£

class Ticket implements Runnable  
{
private int tick=20;
public void run()
{
while(tick>0)
{
//ÏÔʾÏß³ÌÃû¼°ÓàÆ±Êý
System.out.println(Thread.currentThread().getName()+"..tick="+tick);
tick--;
}
}
}

class TicketDemo
{
public static void main(String[] args)
{
Ticket t=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
t1.start();
t2.start();
t3.start();
}
}

³ÌÐòµÄÔËÐкóµÄ½á¹ûÈçÏÂͼ£º

´ÓÔËÐнá¹ûÖпÉÒÔ¿´µ½£¬Ïß³Ì0¡¢1¡¢2¶¼´òÓ¡ÁË20ºÅƱ£¬ÕâÏÔÈ»²»·ûÂôƱÐèÇó¡£¶øÕâÖÖ¶Ô¶à¸öÏß³Ìͬʱ²Ù×÷¹²ÏíÊý¾Ý³öÏֵĴíÎ󣬾ÍÊǶàÏß³ÌËù´æÔڵݲȫÎÊÌâ¡£

2.Óйذ²È«ÎÊÌâµÄÖØÒªÄÚÈÝ

1£©Í¬²½

¶¨Ò壺ͬ²½ÊÇÖ¸ÔÚ¶à¸öÏß³ÌͬʱÔËÐÐʱ£¬¶Ô¶àÌõ²Ù×÷¹²ÏíÊý¾ÝµÄÓï¾ä½øÐÐÌØ¶¨µÄ´¦Àí£¬ÀàËÆÓÚÉÏËø£¬±£Ö¤Í¬Ò»Ê±¼ä¶ÎÖ»ÓÐÒ»¸öÏß³ÌÔÚÖ´Ðй²ÏíÊý¾ÝµÄÓï¾ä£¬Ö»ÓиÃÏß³ÌÈ«²¿Ö´ÐÐÍêºó£¬ÆäËûÏ̲߳ÅÄܽøÈëÖ´ÐС£

ǰÌ᣺

a£©±ØÐëÊÇÁ½¸ö»òÁ½¸öÒÔÉϵÄÏ̡߳£Ô­Òò£ºÈç¹ûÖ»ÓÐÒ»¸öÏß³ÌÖ´Ðеϰ£¬ÊDz»»á·¢Éú¹²ÏíÊý¾Ý´íÎóµÄ¡£

b£©±ØÐëÊǶà¸öÏß³ÌʹÓÃͬһ¸öËø¡£

Àû±×£º

Àû´¦£º¿ÉÒÔ½â¾ö¶àÏ̵߳ݲȫÎÊÌ⣨ºóÃæ»á¾ßÌå½²µ½£©¡£

±×¶Ë£ºÓÉÓÚÐèÒª¶Ô¹²ÏíÊý¾ÝµÄ´úÂë½øÐÐÌØÊâ´¦Àí£¨ÐèÒª²»¶ÏÈ¥ÅжÏËø£©£¬½ÏΪÏûºÄ×ÊÔ´¡£

2£©Í¬²½´úÂë¿é

ͬ²½´úÂë¿éÊÇÖ¸¶ÔÒ»¶Ô´óÀ¨ºÅ{}ÀïµÄ´úÂë½øÐÐͬ²½£¬Ò²¾ÍÊǶà¸öÏß³ÌÔËÐÐʱ£¬Ê¼ÖÕ±£³Ö¸Ã´óÀ¨ºÅ{}µÄ´úÂëÖ»ÓÐÒ»¸öÏß³ÌÖ´ÐС£

ͬ²½´úÂë¿éµÄ¸ñʽ£º

¡¡synchronized (¶ÔÏó)

{

ÐèÒª±»Í¬²½µÄ´úÂ룻

}

synchronizedÊÇjavaµÄ¹Ø¼ü×Ö£¬ÓÃÀ´¸ø´úÂë¿é»òº¯Êý½øÐмÓËø£¬µ±ËüËø¶¨Ò»¸öº¯Êý»òÕßÒ»¸ö´úÂë¿éµÄʱºò£¬Í¬Ò»Ê±¿Ì×î¶àÖ»ÓÐÒ»¸öÏß³ÌÖ´ÐÐÕâ¶Î´úÂë¡£¶øÀ¨ºÅÄڵĶÔÏó¾ÍÏà¶ÔÓÚËøµÄÀàÐÍ£¬Èç¶ÔÏóΪObject£¬ÄÇôÕâ¸öËøµÄÀàÐ͵ľÍΪObject¶ÔÏó¡£

µ±¶à¸öÏ̲߳¢·¢·ÃÎÊͬһ¸ö¶ÔÏóÖеÄÕâ¸ö¼ÓËøÍ¬²½´úÂë¿éʱ£¬Ò»¶Îʱ¼äÄÚÖ»ÄÜÓÐÒ»¸öÏ̵߳õ½Ö´ÐС£ÁíÒ»¸öÏ̱߳ØÐëµÈ´ýµ±Ç°Ïß³ÌÖ´ÐÐÍêÕâ¸ö´úÂë¿éÒÔºó²ÅÄÜÖ´ÐиôúÂë¿é¡£

×¢£º¶ÔÏó¿ÉÒÔΪ×Ö½ÚÂëÎļþ¶ÔÏó»òÓÃnew´´½¨¶ÔÏóµÄ¶ÔÏóÃû£¬Ò²¿ÉÒÔÊÇthis£¬µ«±ØÐë±£Ö¤¶ÔÏóÔÚÄÚ´æÖÐÊÇΨһµÄ£¬ÈçÄäÃû¶ÔÏó¾Í²»ÄÜʹÓã¬ÒòΪËü²»Äܱ£Ö¤Î¨Ò»¡£

3£©Í¬²½º¯Êý

ͬ²½º¯ÊýÊÇÖ¸¶Ôº¯ÊýµÄ×÷Ó÷¶Î§ÄÚµÄËùÓдúÂë½øÐÐͬ²½¡£Í¬²½º¯ÊýµÄ¸ñʽÈçÏ£º

ÐÞÊηû  synchronized  ·µ»ØÖµÀàÐÍ  º¯ÊýÃû³Æ(²ÎÊýÀàÐÍ1  ²ÎÊýÃû³Æ1£¬²ÎÊýÀàÐÍ2  ²ÎÊýÃû³Æ2£¬...)

{

º¯ÊýÄÚ´úÂ룻

}

ʾÀý£ºpublic synchronized void print(int x)

{

º¯ÊýÄÚͬ²½µÄ´úÂ룻

}

µ±Í¬²½º¯Êý±»static¹Ø¼ü×ÖÐÞÊκ󣬸Ãͬ²½º¯Êý¾Í³ÉΪ¾²Ì¬Í¬²½º¯Êý¡£¾²Ì¬Í¬²½º¯ÊýʾÀýÈçÏ£º

public static synchronized void print(int x)

{

¾²Ì¬º¯ÊýÄÚͬ²½µÄ´úÂ룻

}

4£©¹²ÏíÊý¾Ý

µ±¶à¸öÏß³ÌÔËÐÐÔÚͬһ¸ö¶ÔÏóʱ£¬Õâʱ¸Ã¶ÔÏóµÄ³ÉÔ±±äÁ¿¶¼ÊôÓÚ¹²ÏíÊý¾Ý¡£¶ø¶à¸öÏß³ÌÔËÐÐÔÚ²»Í¬¶ÔÏóʱ£¬ÕâʱËùÓеĶÔÏóµÄ¾²Ì¬³ÉÔ±±äÁ¿ÊôÓÚ¹²ÏíÊý¾Ý¡£

5£©Ëø

Ëø¾ÍÊÇָͬ²½´úÂë¿éºÍͬ²½º¯ÊýÖеÄsynchronized¹Ø¼ü×Ö£¬Èç¹û´úÂë¿é»òº¯Êý±»¸Ã¹Ø¼ü×ÖÐÞÊΣ¬¾ÍÏ൱ÓÚÉÏÁËÒ»°ÑËø¡£µ«ÊÇËø¾ßÓжàÖÖÀàÐÍ£¬¶ø¶ÔÏó¾ÍÊÇ´ú±íËøµÄÀàÐÍ¡£

ËøµÄÀàÐÍ£º

a£©Í¬²½´úÂë¿éµÄËøµÄÀàÐÍÈ¡¾öÓÚÀ¨ºÅÄڵĶÔÏ󣬸öÔÏó¿ÉÒÔ½øÐÐ×Ô¶¨Òå¡£

b£©Í¬²½º¯ÊýÖеÄËøµÄÀàÐÍÊÇthis£¬±íʾ±¾Àà¶ÔÏó¡£

c£©¾²Ì¬Í¬²½º¯ÊýµÄËøµÄÀàÐÍÊÇ×Ö½ÚÂëÎļþ¶ÔÏ󣬱íʾ±¾ÀàµÄ×Ö½ÚÂëÎļþ¡£

ËÀËø£ºµ±Í¬²½ÖÐǶÌ×ͬ²½¾ÍÓпÉÄÜ»áÒý·¢ËÀËøÏÖÏó£¬Ó¦±ÜÃâ³öÏÖÕâÖÖÇé¿ö£¨ºóÃæ»á¾ßÌå½²µ½£©¡£

3.½â¾ö°²È«ÎÊÌâµÄ°ì·¨

ͨ¹ý·ÖÎö¶àÏ̳߳öÏֵݲȫÎÊÌ⣬²»ÄÑ·¢ÏÖ£¬ÎÊÌâµÄÔ­Òò¾ÍÊÇÒòΪһ¸öÏß³ÌÖ´Ðй²ÏíÊý¾ÝµÄÓï¾äʱ£¬»¹Ã»Ö´ÐÐÍ꣬ÁíÒ»¸öÏ߳̾ͲÎÓë½øÀ´Ö´ÐУ¬Õâʱ¾Íµ¼ÖÂÁ˹²ÏíÊý¾Ý·¢Éú´íÎó¡£ÎªÁ˱ÜÃâ¹²ÏíÊý¾Ý·¢Éú´íÎ󣬿Éͨ¹ý¶ÔÐèÒªÖ´Ðй²ÏíÓï¾äµÄ´úÂë½øÐÐͬ²½´¦Àí£¬ÈÃÒ»¶Îʱ¼äÄÚÖ»ÓÐÒ»¸öÏß³ÌÖ´Ðиù²ÏíÓï¾äµÄ´úÂ룬ֻÓе±Ò»¸öÏß³ÌÖ´ÐÐÍêºó£¬ÁíÒ»¸öÏ̲߳ÅÄܲÎÓë½øÐÐÖ´ÐС£Í¨¹ý¶Ô²Ù×÷¹²ÏíÊý¾ÝµÄÓï¾ä½øÐÐͬ²½´¦Àí£¬¾ÍÄܺܺýâ¾ö¶àÏ̳߳öÏֵݲȫÎÊÌâ¡£

¶Ô²Ù×÷¹²ÏíÊý¾ÝµÄÓï¾ä½øÐÐͬ²½´¦Àí£¬·½·¨ÓÐÁ½ÖÖ£º

1£©ÓÃͬ²½´úÂë¿é´¦Àí¹²ÏíÊý¾Ý

ͨ¹ý½«²Ù×÷¹²ÏíÊý¾ÝµÄÓï¾äͨ¹ýsynchronized¹Ø¼ü×Ö¼ÓËø£¬½øÐÐͬ²½´¦Àí¡£

³ÌÐòʾÀý£º½â¾öÇ°ÃæÂòƱ³ÌÐò³öÏֵݲȫÎÊÌâ

class Ticket implements Runnable  
{
private int tick=20;
Object obj=new Object();
public void run()
{
while(tick>0)
{
//ͨ¹ýͬ²½´úÂë¿é½â¾ö³öÏֵݲȫÎÊÌâ
synchronized(obj)
{
//¶à¸öÏ̲߳Ù×÷ʱ£¬±ØÐë¶Ô¹²ÏíÊý¾Ýtick½øÐÐÅжϣ¬±£Ö¤Ç°ÃæÖ´ÐÐÏ̲߳Ù×÷tickºó£¬Äܹ»´«µÝµ½µ±Ç°Ïß³Ì
if (tick>0)
{
//ÏÔʾÏß³ÌÃû¼°ÓàÆ±Êý
System.out.println(Thread.currentThread().getName()+"..tick="+tick);
tick--;
}
}
}
}
}

class TicketDemo
{
public static void main(String[] args)
{
Ticket t=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
t1.start();
t2.start();
t3.start();
}
}

³ÌÐòÔËÐеĽá¹ûͼÏÂͼ£º

ͨ¹ý½øÐÐͬ²½´¦Àíºó£¬ÏÔÈ»ÒÑÒѽâ¾ö³ÌÐò³öÏֵݲȫÎÊÌâ¡£

2£©ÓÃͬ²½º¯Êý´¦Àí¹²ÏíÊý¾Ý

ͨ¹ý½«²Ù×÷¹²ÏíÊý¾ÝµÄÓï¾ä·Åµ½Í¬²½º¯ÊýÖУ¬ÊµÏÖͬ²½¡£

³ÌÐòʾÀý£º½â¾öÂòƱ³ÌÐòµÄ³öÏֵݲȫÎÊÌâ¡£

class Ticket implements Runnable  
{
private int tick=20;
public void run()
{
while(tick>0)
{
print();
}
}

//ͨ¹ýͬ²½º¯Êý½â¾ö°²È«ÎÊÌâ
public synchronized void print()
{
//¶à¸öÏ̲߳Ù×÷ʱ£¬±ØÐë¶Ô¹²ÏíÊý¾Ýtick½øÐÐÅжϣ¬±£Ö¤Ç°ÃæÖ´ÐÐÏ̲߳Ù×÷tickºó£¬Äܹ»´«µÝµ½µ±Ç°Ïß³Ì
if (tick>0)
{
//ÏÔʾÏß³ÌÃû¼°ÓàÆ±Êý
System.out.println(Thread.currentThread().getName()+"..tick="+tick);
tick--;
}
}
}

class TicketDemo3
{
public static void main(String[] args)
{
Ticket t=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
t1.start();
t2.start();
t3.start();
}
}

³ÌÐòÔËÐкóµÄ½á¹ûÈçÏÂͼ£º

´ÓÔËÐнá¹û¿ÉÒÔ¿´³ö£¬Í¬²½º¯ÊýÒ²ºÜºÃµÄ½â¾öÁ˸ÃÂòƱ³ÌÐò³öÏֵݲȫÎÊÌâ¡£¡¡

4.ËÀËøÎÊÌâ

µ±¶à¸öÏß³ÌͬʱÔËÐÐÔÚͬһ¸ö¶ÔÏóÖÐʱ£¬´æÔÚÁ½¸ö»ò¶à¸ö²»Í¬ÀàÐ͵Äͬ²½£¬ÇÒÕâЩͬ²½Ðγɻ¥ÏàǶÌ×£¬ÕâÑù¾Íµ¼ÖÂÁ½¸öÏß³ÌÔÚ½øÈëÁË×Ô¼ºµÄͬ²½£¨Ëø£©Ê±£¬Í¬Ê±Ò²Ôڵȴý½øÈë¶Ô·½µÄͬ²½ÖУ¬´Ó¶ø·¢ÉúËÀËøÏÖÏó¡£

ËÀËøµÄ´úÂëʾÀý£º

/* 
ÌâÄ¿£ºÐ´Ò»¸öËÀËø³ÌÐò¡£
˼·£º
1.¶¨ÒåÒ»¸öÀ࣬²¢ÊµÏÖRunnable½Ó¿Ú¡£
2.¸´Ð´run()·½·¨¡£
3.ÔÚrun()·½·¨´æÔÚÁ½¸öͬ²½Ðγɻ¥ÏàǶÌס£
4.ÔÚ×Ô¶¨ÒåÀàÖУ¬´´½¨Ò»¸ö±êÖ¾flag¡£
5.ÔÚÖ÷º¯ÊýÖд´½¨Ò»¸öỊ̈߳¬²¢Æô¶¯£¬´ËʱÈÃÖ÷Ï̶߳³½á10ºÁÃ룬¸Ä±äflag±êÖ¾£¬´´½¨ÁíÒ»¸öÏ̲߳¢Æô¶¯¡£
*/
class Test implements Runnable
{
boolean flag=true;
private int tick=100;
Object obj=new Object();
public void run()
{
if(flag)
{
while (tick>0)
{
//ͬ²½´úÂë¿éµÄËøµÄÀàÐÍΪobj£¬Í¬Ê±Ç¶Ì×ͬ²½º¯ÊýÇÒËøµÄÀàÐÍΪthis
synchronized(obj)
{
show();
}
}
}
else
{
while (tick>0)
{
show();
}
}
}

//ͬ²½º¯ÊýËøµÄÀàÐÍΪthis£¬Í¬Ê±Ç¶Ì×ͬ²½´úÂë¿éÇÒËøµÄÀàÐÍΪobj
public synchronized void show()
{
synchronized(obj)
{
if(tick>0)
{
System.out.println(Thread.currentThread().getName()+"..tick="+tick);
tick--;
}
}
}
}
class TestDemo
{
public static void main(String[] args)
{
Test t=new Test();
new Thread(t).start();

//ÓÉÓÚsleep()·½·¨Å׳öÁËÒì³££¬ËùÒÔÐè½øÐÐtry´¦Àí
try
{
Thread.sleep(10);
}
catch (Exception e)
{
}

t.flag=false;
new Thread(t).start();
}
}

³ÌÐòÔËÐеĽá¹ûÈçÏÂͼ£º

´ÓÔËÐнá¹û¿´³ö£¬³ÌÐò·¢ÉúÁËËÀËø£¬¿¨×¡ÁË¡£ÔÚ±à³ÌÖÐÓ¦±ÜÃâËÀËøÏÖÏóµÄ·¢Éú¡£

5.ÎÊÌâ˼¿¼

ÈçºÎ·¢ÏÖ¶àÏ̵߳ݲȫÎÊÌ⣿

a£©Ã÷È·ÄÄЩ´úÂëÊǶàÏ̵߳ÄÔËÐдúÂë¡£

b£©Ã÷È·ÄÄЩÊǹ²ÏíÊý¾Ý¡£

c£©Ã÷È·¶àÏß³ÌÔËÐдúÂëÖÐÄÄЩÓï¾äÊDzÙ×÷¹²ÏíÊý¾ÝµÄ´úÂë¡£

6.СÁ·Ï°£º

ÒªÇ󣺶Ե¥ÀýÉè¼ÆÄ£Ê½ÖеÄÀÁººÊ½¼Óͬ²½´¦Àí

//¶Ôµ¥ÀýÉè¼ÆÄ£Ê½ÖÐÀÁººÊ½¼Óͬ²½  
class Single
{
private static Single s=null;

//¶Ô¹¹Ô캯Êý½øÐÐ˽Óл¯£¬½ûÖ¹ÍⲿÆäËûÀàÖ±½Ó½¨Á¢¶ÔÏó
private Single()
{
}
public static Single getInstance()
{
//ͨ¹ý¶Ôs½øÐÐË«ÖØÅжÏÌá¸ß³ÌÐòµÄЧÂÊ
if (s==null)
{
//ÓÉÓÚ¾²Ì¬¼ÓÔØÊ±£¬¶ÔÏó»¹²»´æÔÚ£¬Òò´Ë¿ÉÖ±½ÓÓñ¾À´µÄ×Ö½ÚÂëÎļþ¶ÔÏó×÷ÎªËøµÄÀàÐÍ
synchronized(Single.class)
{
if (s==null)
{
s=new Single();
}
}
}
return s;
}
}

Îå¡¢Ï̼߳äµÄͨÐÅ

1.ʲôÊÇÏ̼߳äµÄͨÐÅ£¿

Ï̼߳äµÄͨÐÅÊÇÖ¸Ïß³ÌÓëÏß³ÌÖ®¼ä»¥Ïà½øÐÐÐÅÏ¢´«µÝ£¬Ò²¿ÉÒÔÀí½âΪ¶à¸öÏß³ÌÔÚ²Ù×÷ͬһ¸ö×ÊÔ´£¬µ«ÊDzÙ×÷µÄ¶¯×÷²»Ïàͬ¡£

2.Ï̵߳ļ¸ÖÖ״̬

Ïß³ÌÔÚÄÚ´æÖв¢²»ÊÇÒ»Ö±´¦ÓÚÔËÐÐ״̬£¬ÔÚjavaÖУ¬Ïß³Ì״̬±»Ï¸·ÖΪÎåÖÖ״̬£¬·Ö±ðΪ±»´´½¨×´Ì¬¡¢ÔËÐÐ״̬¡¢×èÈû״̬£¨ÁÙʱ״̬£©¡¢¶³½á״̬ºÍÏûÍö״̬¡£

1£©±»´´½¨×´Ì¬

´¦ÓÚ¸Ã״̬µÄÏ̵߳ȴý±»Æô¶¯£¬ÐèÒªµ÷ÓÃstart()·½·¨¡£

2£©ÔËÐÐ״̬

µ±Ï̱߳»Æô¶¯ºó£¬¾Í½øÈëÔËÐÐ״̬£¬´ËʱÏ̻߳ñµÃcpuµÄÖ´ÐÐȨ£¬ÕýÔÚ±»Ö´ÐС£

3£©¶³½á״̬

µ±Ïß³ÌÔÚÔËÐÐ״̬ʱ£¬Ö´ÐÐÁËsleep()·½·¨»òwait()·½·¨ºó£¬¸ÃÏ߳̾ʹ¦ÓÚ¶³½á״̬¡£´¦ÓÚ¸Ã״̬µÄÏß³ÌʧȥÁËcpuÖ´ÐÐȨ£¬Í¬Ê±Ò²²»¾ß±¸»ñÈ¡cpuÖ´ÐÐȨµÄ×ʸñ¡£

×¢£ºSleep()·½·¨±íʾÊÍ·ÅcpuµÄÖ´ÐÐȨ£¬µ«Ã»ÓÐÊÍ·ÅËø£¬¶øwait()·½·¨±íʾÊÍ·ÅÁËcpuÖ´ÐÐȨ£¬Í¬Ê±Ò²ÊÍ·ÅÁËËø¡£

4£©×èÈû״̬£¨»òÁÙʱ״̬£©

µ±´¦ÓÚ¶³½á״̬µÄỊ̈߳¬±»ÆäËûÏß³ÌÖ´ÐÐÁËnotify()·½·¨»ònotifyAll()·½·¨Ê±£¬¸ÃÏ߳̾ʹ¦ÓÚ×èÈû״̬¡£´¦ÓÚ¸Ã״̬µÄÏ߳̾ßÓлñÈ¡cpuÖ´ÐÐȨµÄ×ʸñ£¬µ«»¹Ã»ÓÐÖ´ÐÐȨ¡£

5£©ÏûÍö״̬

µ±Ï̱߳»Ö´ÐÐÁËstop()·½·¨»òÔËÐеÄrun()·½·¨½áÊø£¬¸ÃÏ߳̾ʹ¦ÓÚÏûÍö״̬¡£

Ï̵߳ĸ÷ÖÖ״̬ͼ½â£º

3.Ï̼߳äͨÐÅ

1£©µÈ´ý»½ÐÑ»úÖÆ

µ±¶à¸öÏß³ÌÔÚ¶Ô¹²ÏíÊý¾ÝÖ´Ðв»Í¬µÄ²Ù×÷ʱ£¬³ýÁËÐèÒª¶Ô¹²ÏíÊý¾Ý½øÐÐͬ²½Ö®Í⣬ÿ¸öÔËÐÐÏ̻߳¹Ðèͨ¹ýÖ´ÐÐwait()¡¢notify()¼°notifyAll()·½·¨ÈÃ×Ô¼º´¦ÓÚ¶³½á״̬»òʹ±ðµÄÏ̴߳¦ÓÚ×èÈû״̬£¬ÒԴﵽЭͬ²Ù×÷¹²Ïí×ÊÔ´µÄÄ¿µÄ¡£ÕâÖÖÏ̼߳äͨÐÅ»¥Ï໽ÐÑ»òʹ×Ô¼ºµÈ´ýµÄÐÐΪ¾Í¿ÉÒÔÀí½âΪµÈ´ý»½ÐÑ»úÖÆ¡£

Ï̳߳أºÓÃÀ´´æ·Å´¦ÓÚ¶³½á״̬µÄÏ̡߳£µ±Ï̴߳¦ÓÚ¶³½á״̬ʱ£¬´ËÏ߳̽«°´ÕÕ¶³½áµÄÏȺó˳Ðò´æ·ÅÓÚÏ̳߳ØÖС£

wait()·½·¨£ºÔÚÆäËûÏ̵߳÷Óô˶ÔÏóµÄ notify() ·½·¨»ò notifyAll() ·½·¨Ç°£¬µ¼Öµ±Ç°Ï̵߳ȴý¡£´Ëʱ¸ÃÏ̴߳¦ÓÚ¶³½á״̬£¬´æ·ÅÓÚÏ̳߳ØÖС£

notify()·½·¨£º»½ÐÑÔڴ˶ÔÏó¼àÊÓÆ÷£¨Ëø£©ÉϵȴýµÄµ¥¸öỊ̈߳¬Ò²¾ÍÊÇ»½ÐÑÏ̳߳ØÖеÚÒ»¸ö´¦ÓÚ¶³½á״̬µÄÏ̡߳£

notifyAll()·½·¨£º»½ÐÑÔڴ˶ÔÏó¼àÊÓÆ÷ÉϵȴýµÄËùÓÐỊ̈߳¬¼´»½ÐÑÏ̳߳ØÖÐËùÓеÄÏ̡߳£

×¢£ºwait()¡¢notify()¡¢notifyAll()·½·¨±ØÐëʹÓÃÔÚͬ²½ÖУ¬ÒòΪÈý¸ö·½·¨¶¼Ö»ÄܶԳÖÓмàÊÓÆ÷£¨»òËø£©µÄÏ̵߳ĽøÐвÙ×÷£¬Ö»ÓÐÔÚͬ²½ÖÐÏ̲߳ſÉÄܳÖÓмàÊÓÆ÷£¬·ñÔò½«²úÉúInterruptedExceptionÒì³££¬ËùÒÔ±ØÐëʹÓÃÔÚͬ²½ÖС£

˼¿¼£ºÍ¨¹ý²éѯAPI·¢ÏÖ£¬ÉÏÊöÈý¸ö·½·¨¶¼¶¨ÒåÔÚObjectÀàÖУ¬µ«ÎªÊ²Ã´Ò»¶¨Òª¶¨ÒåÔÚ¸ÃÀàÖÐÄØ£¿

´ð£ºÒòΪÕâЩ·½·¨ÔÚ²Ù×÷ͬ²½ÖÐÏß³Ìʱ£¬¶¼±ØÐë¶¼Òª±êʶËûÃÇËù²Ù×÷Ï̵߳ÄËø£¬Ö»ÓÐͬһ¸öËøÉϵı»µÈ´ýỊ̈߳¬¿ÉÒÔ±»Í¬Ò»¸öËøÉÏnotify()»½ÐÑ£¬²»¿ÉÒÔ¶Ô²»Í¬ËøÖеÄÏ߳̽øÐл½ÐÑ£¬Ò²¾ÍÊÇ˵£¬µÈ´ýºÍ»½ÐѱØÐëÊÇͬһ¸öËø¡£

Ïß³ÌͨÐŵĴúÂëʾÀý£ºÓöàÏß³ÌÍê³É³ÖÐøÉú³ÉÏû·ÑÉÌÆ·µÄ¹ý³Ì£¬¼´Éú²úÕßÉú³ÉÒ»¸öÉÌÆ·£¬È»ºóÏû·ÑÕßÏû·ÑÉú²úºÃµÄÉÌÆ·£¬³ÖÐø½øÐС£

/* 
¶àÏß³ÌͨÐÅ£ºÉú²úÕßÏû·ÑÕß
*/

//¶¨ÒåÒ»¸ö×ÊÔ´Àà
class Resource
{
private String name;
private int count=1;
private boolean flag=false;

//¶¨ÒåÒ»¸öÉú²ú·½·¨
public synchronized void set(String name)
{
while (flag)
{
try
{
//µ±Éú²úµÄÉÌÆ·Ã»ÓÐÏû·Ñ£¬ÔòÍ£Ö¹Éú²ú
this.wait();
}
catch (Exception e)
{
}
}

this.name=name+"..."+count++;
System.out.println(Thread.currentThread().getName()+"..Éú²úÕß.."+this.name);

//±íʾÉú²úÍêÒ»¸öÉÌÆ·
flag=true;
//»½ÐÑÏû·ÑÕß½øÐÐÏû·Ñ
this.notifyAll();
}

//¶¨ÒåÒ»¸öÏû·Ñ·½·¨
public synchronized void out()
{
while (!flag)
{
try
{
//Èç¹ûÉú²úÕß»¹Ã»ÓÐÉú²úÍêÉÌÆ·£¬ÔòÍ£Ö¹Ïû·Ñ
this.wait();
}
catch (Exception e)
{
}
}
System.out.println(Thread.currentThread().getName()+"..Ïû·ÑÕß......."+this.name);

//±íʾÏû·ÑÍêÒ»¸öÉÌÆ·
flag=false;
//»½ÐÑÉú²úÕß½øÐÐÉú²ú
this.notifyAll();
}
}

//¶¨ÒåÒ»¸öÉú²úÕßÏß³Ì
class Producer implements Runnable
{
private Resource res;
Producer(Resource res)
{
this.res=res;
}
public void run()
{
//²»¶Ï½øÐÐÉú²úÉÌÆ·
while (true)
{
res.set("--ÉÌÆ·");
}
}
}

//¶¨ÒåÒ»¸öÏû·ÑÕßÏß³Ì
class Consumer implements Runnable
{
private Resource res;
Consumer(Resource res)
{
this.res=res;
}
public void run()
{
//²»¶Ï½øÐÐÏû·ÑÉÌÆ·
while (true)
{
res.out();
}
}
}
class ProducerConsumerDemo
{
public static void main(String[] args)
{
Resource r=new Resource();
new Thread(new Producer(r)).start();//µÚÒ»¸öÉú²úÕßÏß³Ì
new Thread(new Producer(r)).start();//µÚ¶þ¸öÉú²úÕßÏß³Ì
new Thread(new Consumer(r)).start();//µÚÒ»¸öÏû·ÑÕßÏß³Ì
new Thread(new Consumer(r)).start();//µÚ¶þ¸öÏû·ÑÕßÏß³Ì
}
}

³ÌÐòÔËÐкóµÄ²¿·Ö½á¹ûÈçÏÂͼ£º

˼¿¼£º³ÌÐòÖÐÉú²úºÍÏû·Ñ¶¼Ê¹ÓÃnotifyAll()À´»½ÐÑÏ̶߳ø²»Ê¹ÓÃnotify()£¬ÎªÊ²Ã´£¿

´ð£ºÒòΪnotify()»½ÐѵÄÊÇÏ̳߳ØÖеÚÒ»¸ö¶³½áµÄỊ̈߳¬¶ø²»Ò»¶¨ÊǶԷ½Ị̈߳¬ÕâÑù¼«ÓпÉÄܵ¼ÖÂÏß³ÌÈ«²¿µÈ´ý£¬¶øÊ¹ÓÃnofifyAll()·½·¨»½ÐѵÄÊÇÏ̳߳ØÖеÄÈ«²¿Ị̈߳¬ÕâÑù¾ÍÒ»¶¨»á»½ÐѶԷ½Ị̈߳¬´ËʱֻÐèÈû½ÐѵÄÏ̼߳ÌÐøÈ¥ÅжÏflag±êÖ¾¼´¿É¡£

2£©Jdk1.5Éý¼¶ÐÂÌØÐÔ

JdkÉý¼¶Ö®ºó£¬Ëù×öµÄһЩ¸Ä±äºÍÌæ»»ÈçÏ£º

a£©ÓÃlockÌæ´úÁËsynchronizedµÄ·½·¨ºÍÓï¾ä£º

synchronized±»Ìæ»»³ÉÁËÏÔʾµÄlock£¬¼´lockÌṩÁËÏÔʾµÄlock()£¨»ñÈ¡Ëø£©ºÍunlock()£¨ÊÍ·ÅËø£©·½·¨£¬¾ßÓиü¹ã·ºµÄËø¶¨²Ù×÷¡£lockΪ½Ó¿Ú£¬ÒªÊ¹ÓÃlockÖеķ½·¨£¬¾Í±ØÐëʵÏÖlock()½Ó¿Ú£¬µ«·¢ÏÖlock()·½·¨ÒѾ­ÓÐʵÏÖ×ÓÀ࣬ÈçReentrantLock£¬Òò´Ë¿É½¨Á¢ÒÔʵÏÖµÄ×ÓÀàµÄ¶ÔÏó¡£lockʵÏÖͬ²½µÄ¸ñʽÈçÏ£º

Lock lock=new ReentrantLock();//´´½¨Ò»¸öËøµÄ¶ÔÏó  

lock.lock();

//ÐèÒª±»Í¬²½µÄ´úÂë;

lock.unlock();</span>

b£©ÓÃcondition½Ó¿ÚÌæ´úÁËObject¼àÊÓÆ÷µÄ·½·¨£º

Condition ½« Object ¼àÊÓÆ÷·½·¨£¨wait¡¢notify ºÍ notifyAll£©·Ö½â³É½ØÈ»²»Í¬µÄ¶ÔÏó£¬ÒÔ±ãͨ¹ý½«ÕâЩ¶ÔÏóÓëÈÎÒâ Lock ʵÏÖ×éºÏʹÓã¬ÎªÃ¿¸ö¶ÔÏóÌṩ¶à¸öµÈ´ý¡£ÆäÖÐwait()±»Ì滻ΪconditionÖеÄawait()£¬notify()±»Ì滻Ϊsignal()£¬notifyAll()±»Ì滻ΪsignalAll()¡£

conditionÖеķ½·¨±ØÐëÒª½¨Á¢condition¶ÔÏó²ÅÄܵ÷Ó㬵«conditionΪ½Ó¿Ú£¬²»Äܽ¨Á¢¶ÔÏ󣬵«¿Éͨ¹ý½¨Á¢µÄlock()×ÓÀà¶ÔÏóµ÷ÓÃnewCondition()·½·¨À´»ñÈ¡condition¶ÔÏó¡£Ò»¸öËø¶ÔÏó¿ÉÒÔÓжà¸öcondition¶ÔÏó¡£

Éý¼¶Ö®ºóÏß³ÌͨÐÅ´úÂëʾÀý£ºÒªÇóͬÉÏÀý¡£

import java.util.concurrent.locks.*;  
/*
Jdk1.5Éý¼¶Ö®ºó¶àÏß³ÌͨÐÅ£ºÉú²úÕßÏû·ÑÕß
*/

//¶¨ÒåÒ»¸ö×ÊÔ´Àà
class Resource
{
private String name;
private int count=1;
private boolean flag=false;
private Lock lock=new ReentrantLock();
Condition condition=lock.newCondition();

//¶¨ÒåÒ»¸öÉú²ú·½·¨
public void set(String name)
{
lock.lock();
try
{
while (flag)
{
//µ±Éú²úµÄÉÌÆ·Ã»ÓÐÏû·Ñ£¬ÔòÍ£Ö¹Éú²ú
condition.await();
}
this.name=name+"..."+count++;
System.out.println(Thread.currentThread().getName()+"..Éú²úÕß.."+this.name);

//±íʾÉú²úÍêÒ»¸öÉÌÆ·
flag=true;
//»½ÐÑÏû·ÑÕß½øÐÐÏû·Ñ
condition.signalAll();
}
catch (Exception e)
{
}
finally
{
lock.unlock();
}
}

//¶¨ÒåÒ»¸öÏû·Ñ·½·¨
public void out()
{
lock.lock();
try
{
while (!flag)
{
//Èç¹ûÉú²úÕß»¹Ã»ÓÐÉú²úÍêÉÌÆ·£¬ÔòÍ£Ö¹Ïû·Ñ
condition.await();
}
System.out.println(Thread.currentThread().getName()+"..Ïû·ÑÕß......."+this.name);

//±íʾÏû·ÑÍêÒ»¸öÉÌÆ·
flag=false;
//»½ÐÑÉú²úÕß½øÐÐÉú²ú
condition.signalAll();
}
catch (Exception e)
{
}
finally
{
lock.unlock();
}
}
}

//¶¨ÒåÒ»¸öÉú²úÕßÏß³Ì
class Producer implements Runnable
{
private Resource res;
Producer(Resource res)
{
this.res=res;
}
public void run()
{
//²»¶Ï½øÐÐÉú²úÉÌÆ·
while (true)
{
res.set("--ÉÌÆ·");
}
}
}

//¶¨ÒåÒ»¸öÏû·ÑÕßÏß³Ì
class Consumer implements Runnable
{
private Resource res;
Consumer(Resource res)
{
this.res=res;
}
public void run()
{
//²»¶Ï½øÐÐÏû·ÑÉÌÆ·
while (true)
{
res.out();
}
}
}
class ProducerConsumerDemo
{
public static void main(String[] args)
{
Resource r=new Resource();
new Thread(new Producer(r)).start();//µÚÒ»¸öÉú²úÕßÏß³Ì
new Thread(new Producer(r)).start();//µÚ¶þ¸öÉú²úÕßÏß³Ì
new Thread(new Consumer(r)).start();//µÚÒ»¸öÏû·ÑÕßÏß³Ì
new Thread(new Consumer(r)).start();//µÚ¶þ¸öÏû·ÑÕßÏß³Ì
}
}

³ÌÐòÔËÐкóµÄ²¿·Ö½á¹ûÈçÏÂͼ£º

·¢ÏÖÉÏÊö³ÌÐòÓëδÉý¼¶Ö®Ç°Çø±ð²»´ó£¬µ«ÊÇ·¢ÏÖÉý¼¶Ö®ºóÒ»°ÑËø¿ÉÒÔ¶ÔÓ¦¶à¸öcondition¶ÔÏó£¬Òò´Ë¿ÉÒÔ½«ÉÏÊö´úÂë½øÐÐÓÅ»¯¡£ÀûÓÃÐÂÌØÐÔ£¬¼´Ò»°ÑËø¶ÔÓ¦¶à¸öcondition¶ÔÏóÖ®ºó£¬¿ÉÒÔÖ±½Ó»½ÐѶԷ½µÄÏ̡߳£

ÐÂÌØÐÔÓÅ»¯ºóµÄ´úÂëÈçÏ£º

import java.util.concurrent.locks.*;  
/*
Jdk1.5Éý¼¶Ö®ºó¶àÏß³ÌͨÐÅ£ºÒ»°ÑËø¶ÔÓ¦¶à¸öµÈ´ý
*/

//¶¨ÒåÒ»¸ö×ÊÔ´Àà
class Resource
{
private String name;
private int count=1;
private boolean flag=false;
private Lock lock=new ReentrantLock();
Condition pro=lock.newCondition();
Condition con=lock.newCondition();

//¶¨ÒåÒ»¸öÉú²ú·½·¨
public void set(String name)
{
lock.lock();
try
{
while (flag)
{
//µ±Éú²úµÄÉÌÆ·Ã»ÓÐÏû·Ñ£¬ÔòÍ£Ö¹Éú²ú
pro.await();
}
this.name=name+"..."+count++;
System.out.println(Thread.currentThread().getName()+"..Éú²úÕß.."+this.name);

//±íʾÉú²úÍêÒ»¸öÉÌÆ·
flag=true;
//»½ÐÑÏû·ÑÕß½øÐÐÏû·Ñ
con.signal();
}
catch (Exception e)
{
}
finally
{
lock.unlock();
}
}

//¶¨ÒåÒ»¸öÏû·Ñ·½·¨
public void out()
{
lock.lock();
try
{
while (!flag)
{
//Èç¹ûÉú²úÕß»¹Ã»ÓÐÉú²úÍêÉÌÆ·£¬ÔòÍ£Ö¹Ïû·Ñ
con.await();
}
System.out.println(Thread.currentThread().getName()+"..Ïû·ÑÕß......."+this.name);

//±íʾÏû·ÑÍêÒ»¸öÉÌÆ·
flag=false;
//»½ÐÑÉú²úÕß½øÐÐÉú²ú
pro.signal();
}
catch (Exception e)
{
}
finally
{
lock.unlock();
}
}
}

//¶¨ÒåÒ»¸öÉú²úÕßÏß³Ì
class Producer implements Runnable
{
private Resource res;
Producer(Resource res)
{
this.res=res;
}
public void run()
{
//²»¶Ï½øÐÐÉú²úÉÌÆ·
while (true)
{
res.set("--ÉÌÆ·");
}
}
}

//¶¨ÒåÒ»¸öÏû·ÑÕßÏß³Ì
class Consumer implements Runnable
{
private Resource res;
Consumer(Resource res)
{
this.res=res;
}
public void run()
{
//²»¶Ï½øÐÐÏû·ÑÉÌÆ·
while (true)
{
res.out();
}
}
}
class ProducerConsumerDemo
{
public static void main(String[] args)
{
Resource r=new Resource();
new Thread(new Producer(r)).start();//µÚÒ»¸öÉú²úÕßÏß³Ì
new Thread(new Producer(r)).start();//µÚ¶þ¸öÉú²úÕßÏß³Ì
new Thread(new Consumer(r)).start();//µÚÒ»¸öÏû·ÑÕßÏß³Ì
new Thread(new Consumer(r)).start();//µÚ¶þ¸öÏû·ÑÕßÏß³Ì
}
}

Áù¡¢ThreadÀàµÄÒ»Ð©ÖØÒª·½·¨

1.Í£Ö¹Ïß³Ì

δÉý¼¶Ö®Ç°£¬Í£Ö¹Ïß³ÌÓÃstop()·½·¨£¬µ«ÓÉÓڸ÷½·¨¾ßÓй̶¨µÄ²»°²È«ÐÔ£¬Òò´ËJdkÉý¼¶Ö®ºó£¬stop()·½·¨¾ÍÒѾ­¹ýʱ£¬²»ÔÙʹÓᣵ«ÊÇÈçºÎÍ£Ö¹Ïß³ÌÄØ£¿

ÒªÏëÈÃÏ߳̽áÊø£¬Ö»ÓÐÒ»ÖÖ·½·¨¾ÍÊÇÈÃrun()·½·¨½áÊø¡£ÒªÈÃrun()·½·¨½áÊø£¬¾ÍÐèÒªÓÃÖ÷Ï߳̽øÐпØÖÆ£¬Ö÷Ï߳̿ÉÒÔͨ¹ý¸Ä±äÑ­»·Ìõ¼þÀ´ÈÃrun()·½·¨½áÊø¡£µ«µ±½øÈëÑ­»·µÄÏ̶߳¼´¦ÓÚ¶³½á״̬ʱ£¬Õâʱ¿ØÖÆÑ­»·±ê¼ÇÒ²ÎÞ¼ÃÓÚÊ£¬ÄÇô¾Í±ØÐëÒªÈö³½áµÄÏß³ÌÐÑÀ´£¬JavaÌṩÁËInterrupt()·½·¨À´Èö³½áµÄÏß³ÌËÕÐÑ£¬Óø÷½·¨Ê±»á·¢ÉúInterruptÒì³££¬Ö»ÐèÔÚ´¦ÀíÒì³£Àï½øÐиıäÑ­»·±êÖ¾£¬¼´¿É½áÊøÑ­»·£¬´Ó¶øÊµÏÖÍ£Ö¹Ï̵߳ÄÄ¿µÄ¡£

2.ÊØ»¤Ïß³Ì

µ±Ï̱߳»µ÷ÓÃsetDaemon(boolean on)·½·¨ÇÒbooleanֵΪtrue£¬¸ÃÏ߳̾ͱ»±ê¼ÇÎªÊØ»¤Ị̈߳¬Ò²³Æºǫ́Ï̡߳£Ïß³ÌÒª±»±ê¼ÇÎªÊØ»¤Ị̈߳¬±ØÐëÒªÔÚÆô¶¯¸ÃÏß³Ì֮ǰ½øÐбê¼Ç¡£

ÊØ»¤Ïß³ÌËæ×ÅËùÓеķÇÊØ»¤Ị̈߳¨Ç°Ì¨Ç°³Ì£©½áÊø¶øÖÕÖ¹£¬¼´ÊØ»¤Ï̵߳ĴæÔÚ±ØÐëÖÁÉÙÒªÓÐÒ»¸ö·ÇÊØ»¤Ï̴߳æÔÚ¡£

3.join()·½·¨

¸Ã·½·¨±íʾµÈ´ý¸ÃÏ߳̽áÊø£¬ÁÙʱ¼ÓÈëÏß³ÌÖ´ÐС£ÀýÈ磬µ±AÏß³ÌÖ´Ðе½ÁËBÏ̵߳Äjoin()·½·¨Ê±£¬A¾Í»áµÈ´ý£¬ÊÍ·ÅÖ´ÐÐȨ£¬µÈBÏß³ÌÖ´ÐÐÍ꣬A²Å¾ß±¸»ñÈ¡cpuÖ´ÐÐȨµÄ×ʸñ£¬²Å»áÈ¥Ö´ÐС£Èç¹ûBÏ̻߳¹Î´Ö´ÐÐÍê¾Í´¦ÓÚ¶³½á״̬£¬Õâʱ»á²úÉúInterruptÖжÏÒì³££¬´ËʱAÏ̲߳»±ØµÈ´ýBÖ´ÐÐÍê¾Í¿ÉÒÔÇå³ý¶³½á״̬£¬ÖØÐ»ص½×èÈû״̬¡£

4.toString()·½·¨

·µ»Ø¸ÃÏ̵߳Ä×Ö·û´®±íʾÐÎʽ£¬°üÀ¨Ïß³ÌÃû³Æ¡¢ÓÅÏȼ¶ºÍÏß³Ì×é¡£

Ïß³Ì×飺һ°ãÇé¿öÏ£¬Ë­¿ªÆôµÄ¾ÍÊôÓÚÄĸöÏß³Ì×é¡£

ÓÅÏȼ¶£ºÓÃsetPriority(int newPriority)½øÐÐÉèÖ㬴ú±ícpuÖ´ÐиÃÏß³ÌµÄÆµÂÊ¡£ÓÅÏȼ¶·¶Î§Îª1¡ª10£¬Ä¬ÈÏÓÅÏȼ¶Îª5¡£×îСÓÅÏȼ¶¶¨ÒåΪ³£Á¿MIN_PRIORITY£¬×î´óÓÅÏȼ¶¶¨ÒåΪ³£Á¿MAX_PRIORITY¡£

5.yield()·½·¨

ÔÝÍ£µ±Ç°ÕýÔÚÖ´ÐеÄÏ̶߳ÔÏ󣬲¢Ö´ÐÐÆäËûÏ̡߳£Äܹ»´ïµ½Ïß³ÌÔËÐÐµÄÆ½¾ùЧ¹û¡£

   
2433 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ