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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Java¶àÏß³Ì
 
×÷ÕߣºÐÄÇçgood À´Ô´£ºsegmentfault.com ·¢²¼ÓÚ 2015-9-8
  3090  次浏览      28
 

Java¶àỊ̈߳¨Ò»£©¡¢¶àÏ̵߳Ļù±¾¸ÅÄîºÍʹÓÃ

Ò»¡¢½ø³ÌºÍÏ̵߳Ļù´¡ÖªÊ¶

1¡¢½ø³ÌºÍÏ̵߳ĸÅÄî

½ø³Ì£ºÔËÐÐÖеÄÓ¦ÓóÌÐò³ÆÎª½ø³Ì£¬ÓµÓÐϵͳ×ÊÔ´£¨cpu¡¢Äڴ棩

Ị̈߳º½ø³ÌÖеÄÒ»¶Î´úÂ룬һ¸ö½ø³ÌÖпÉÒÔÓжà¶Î´úÂë¡£±¾Éí²»ÓµÓÐ×ÊÔ´£¨¹²ÏíËùÔÚ½ø³ÌµÄ×ÊÔ´£©

ÔÚjavaÖУ¬³ÌÐòÈë¿Ú±»×Ô¶¯´´½¨ÎªÖ÷Ị̈߳¬ÔÚÖ÷Ïß³ÌÖпÉÒÔ´´½¨¶à¸ö×ÓÏ̡߳£

Çø±ð£º

1¡¢ÊÇ·ñÕ¼ÓÐ×ÊÔ´ÎÊÌâ

2¡¢´´½¨»ò³·ÏúÒ»¸ö½ø³ÌËùÐèÒªµÄ¿ªÏú±È´´½¨»ò³·ÏúÒ»¸öÏß³ÌËùÐèÒªµÄ¿ªÏú´ó¡£

3¡¢½ø³ÌÎªÖØÁ¿¼¶×é¼þ£¬Ïß³ÌΪÇáÁ¿¼¶×é¼þ

¶à½ø³Ì: ÔÚ²Ù×÷ϵͳÖÐÄÜͬʱÔËÐжà¸öÈÎÎñ(³ÌÐò)

¶àÏß³Ì: ÔÚͬһӦÓóÌÐòÖÐÓжà¸ö¹¦ÄÜÁ÷ͬʱִÐÐ

2¡¢Ï̵߳ÄÖ÷ÒªÌØµã

¢Ù¡¢²»ÄÜÒÔÒ»¸öÎļþÃûµÄ·½Ê½¶ÀÁ¢´æÔÚÔÚ´ÅÅÌÖУ»

¢Ú¡¢²»Äܵ¥¶ÀÖ´ÐУ¬Ö»ÓÐÔÚ½ø³ÌÆô¶¯ºó²Å¿ÉÆô¶¯£»

¢Û¡¢Ï߳̿ÉÒÔ¹²Ïí½ø³ÌÏàͬµÄÄڴ棨´úÂëÓëÊý¾Ý£©¡£

3¡¢Ï̵߳ÄÖ÷ÒªÓÃ;

¢Ù¡¢ÀûÓÃËü¿ÉÒÔÍê³ÉÖØ¸´ÐԵŤ×÷£¨ÈçʵÏÖ¶¯»­¡¢ÉùÒôµÈµÄ²¥·Å£©¡£

¢Ú¡¢´ÓÊÂÒ»´ÎÐԽϷÑʱµÄ³õʼ»¯¹¤×÷£¨ÈçÍøÂçÁ¬½Ó¡¢ÉùÒôÊý¾ÝÎļþµÄ¼ÓÔØ£©¡£

¢Û¡¢²¢·¢Ö´ÐеÄÔËÐÐЧ¹û£¨Ò»¸ö½ø³Ì¶à¸öỊ̈߳©ÒÔʵÏÖ¸ü¸´ÔӵŦÄÜ

4¡¢¶àỊ̈߳¨¶à¸öÏß³ÌͬʱÔËÐУ©³ÌÐòµÄÖ÷ÒªÓŵã

¢Ù¡¢¿ÉÒÔ¼õÇáϵͳÐÔÄÜ·½ÃæµÄÆ¿¾±£¬ÒòΪ¿ÉÒÔ²¢ÐвÙ×÷£»

¢Ú¡¢Ìá¸ßCPUµÄ´¦ÀíÆ÷µÄЧÂÊ£¬ÔÚ¶àÏß³ÌÖУ¬Í¨¹ýÓÅÏȼ¶¹ÜÀí£¬¿ÉÒÔÊ¹ÖØÒªµÄ³ÌÐòÓÅÏȲÙ×÷£¬Ìá¸ßÁËÈÎÎñ¹ÜÀíµÄÁé»îÐÔ£»ÁíÒ»·½Ã棬ÔÚ¶àCPUϵͳÖУ¬¿ÉÒ԰Ѳ»Í¬µÄÏß³ÌÔÚ²»Í¬µÄCPUÖÐÖ´ÐУ¬ÕæÕý×öµ½Í¬Ê±´¦Àí¶àÈÎÎñ¡£

¶þ¡¢Ï̵߳Ĵ´½¨ºÍÆô¶¯

Æäʵ¿´¿´API£¬´ÓThreadµÄ¹¹Ôì·½·¨£¬¾Í¿ÉÒÔ¿´³ö´´½¨Ò»¸öÏ̵߳ķ½Ê½:

Thread()

·ÖÅäÐ嵀 Thread ¶ÔÏó¡£

Thread(Runnable target)

·ÖÅäÐ嵀 Thread ¶ÔÏó¡£

Thread(Runnable target,String name)

·ÖÅäÐ嵀 Thread ¶ÔÏó¡£

Thread(String name)

·ÖÅäÐ嵀 Thread ¶ÔÏó¡£

Thread(ThreadGroup group,Runnable target)

·ÖÅäÐ嵀 Thread ¶ÔÏó¡£

Thread(ThreadGroup group,Runnable target,String name)

·ÖÅäÐ嵀 Thread ¶ÔÏó£¬ÒԱ㽫 target ×÷ΪÆäÔËÐжÔÏ󣬽«Ö¸¶¨µÄ name ×÷ΪÆäÃû³Æ£¬²¢×÷Ϊ group ËùÒýÓõÄÏß³Ì×éµÄÒ»Ô±¡£

Thread(ThreadGroup group,Runnable target,String name, long stackSize)

·ÖÅäÐ嵀 Thread ¶ÔÏó£¬ÒԱ㽫 target ×÷ΪÆäÔËÐжÔÏ󣬽«Ö¸¶¨µÄ name ×÷ΪÆäÃû³Æ£¬×÷Ϊ group ËùÒýÓõÄÏß³Ì×éµÄÒ»Ô±£¬²¢¾ßÓÐÖ¸¶¨µÄ¶ÑÕ»´óС¡£

Thread(ThreadGroup group,String name)

·ÖÅäÐ嵀 Thread ¶ÔÏó¡£

ºóÃæ4¸ö¹¹Ôì·½·¨´´½¨Ò»¸öÏ̲߳¢¼ÓÈëµ½Ò»¸öÏß³Ì×éÖУ¬µ«ÊÇ´´½¨Ï̵߳ķ½Ê½ºÍÇ°ÃæµÄÏàËÆ¡£

javaÖд´½¨Ò»¸öÏß³ÌÓÐÁ½ÖÖ·½Ê½£º

1¡¢¼Ì³ÐThreadÀà£¬ÖØÐ´run()·½·¨£¬È»ºóÖ±½ÓnewÕâ¸ö¶ÔÏóµÄʵÀý£¬´´½¨Ò»¸öÏ̵߳ÄʵÀý¡£È»ºóµ÷ÓÃstart()·½·¨Æô¶¯Ïß³Ì

2¡¢ÊµÏÖRunnable½Ó¿Ú£¬ÖØÐ´run()·½·¨£¬È»ºóµ÷ÓÃnew Thread(runnable)µÄ·½Ê½´´½¨Ò»¸öỊ̈߳¬È»ºóµ÷ÓÃstart()·½·¨Æô¶¯Ïß³Ì

Æäʵ¿´ThreadµÄÔ´Îļþ£¬·¢ÏÖËüÒ²ÊÇʵÏÖÁËRunnable½Ó¿ÚµÄ¡£

public class Thread implements Runnable   

1¡¢¼Ì³ÐThreadÀàµÄ·½Ê½

public class Test1 {  
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
MyThread myThread=new MyThread();
myThread.start();
}
}
class MyThread extends Thread{
int i=0;
@Override
public void run() {
while (i<10) {
System.out.println(this.getName()+" iµÄÖµ "+i);
i++;
}
}
}

2¡¢ÊµÏÖRunnable½Ó¿Ú

public class Test1 {  
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
Thread thread=new Thread(new MyRunnable());
thread.start();
}
}
class MyRunnable implements Runnable{
int i=0;
@Override
public void run() {
while (i<10) {
System.out.println(Thread.currentThread().getName()+" iµÄÖµ "+i);
i++;
}
}
}

×¢Ò⣺

¢Ù¡¢Ôڼ̳ÐThreadµÄ·½Ê½ÖУ¬¿ÉÒÔʹÓÃgetName()·½·¨£¬À´»ñµÃµ±Ç°Ï̵߳ÄÃû×Ö£¬ÕâÊÇÒòΪÔÚThreadÀàÖУ¬ÓÐÕâ¸ö·½·¨¡£¿ÉÊÇÔÚʵÏÖRunnable·½Ê½ÖУ¬È´²»¿ÉÒÔʹÓÃthis.getName()£¬ÒòΪRunnable½Ó¿ÚûÓÐÕâ¸ö·½·¨£¨¿ÉÒÔ¿´³öÀ´£¬ÒòΪÎÒÃÇûÓÐÌáʾÎÒÃÇÐèÒªÖØÐ´Õâ¸ö·½·¨£©£¬ËùÒÔÖ»ÄÜͨ¹ýThreadµÄ¾²Ì¬·½·¨Thread.currentThread()È¡µÃµ±Ç°µÄThread¶ÔÏó£¬ÔÚµ÷ÓÃgetName()·½·¨£¬À´È¡µÃµ±Ç°Ï̵߳ÄÃû×Ö¡£

¢Ú¡¢¶ÔJavaÀ´Ëµ£¬run()·½·¨Ã»ÓÐÈκÎÌØ±ðÖ®´¦¡£Ïñmain()·½·¨Ò»Ñù£¬ËüÖ»ÊÇÐÂÏß³ÌÖªµÀµ÷Óõķ½·¨Ãû³Æ(ºÍÇ©Ãû)¡£Òò´Ë£¬ÔÚRunnableÉÏ»òÕßThreadÉϵ÷ÓÃrun·½·¨ÊǺϷ¨µÄ¡£µ«²¢²»Æô¶¯ÐµÄÏ̡߳£Ö»Óе÷ÓÃstart()·½·¨²Å»áÆô¶¯ÐÂÏ̡߳£

3¡¢Á½ÖÖ·½Ê½µÄ¶Ô±È

²ÉÓÃʵÏÖRunnable½Ó¿Ú·½Ê½µÄ¶àÏ߳̾ßÓÐÓÅÊÆ£¬Ò»°ã¶¼»áʹÓÃÕâÖÖ·½Ê½£º

1¡¢Ïß³ÌÀàÖ»ÊÇʵÏÖÁËRunnable½Ó¿Ú£¬»¹¿ÉÒÔ¼Ì³ÐÆäËûÀà¡£

2¡¢ÔÚÕâÖÖ·½Ê½Ï£¬¿ÉÒÔ¶à¸öÏ̹߳²ÏíÒ»¸öRunnable target¶ÔÏó£¬ËùÒԷdz£Êʺ϶à¸öÏàͬÏß³ÌÀ´´¦Àíͬһ·Ý×ÊÔ´µÄÇé¿ö£¬´Ó¶ø¿ÉÒÔ½«CPU¡¢´úÂëºÍÊý¾Ý·Ö¿ª£¬ÐγÉÇåÎúµÄÄ£ÐÍ£¬½ÏºÃµÄÌåÏÖÁËÃæÏò¶ÔÏóµÄ˼Ïë¡£

Java¶àỊ̈߳¨¶þ£©¡¢Ï̵߳ÄÉúÃüÖÜÆÚºÍ״̬¿ØÖÆ

Ò»¡¢Ï̵߳ÄÉúÃüÖÜÆÚ

Ïß³Ì״̬ת»»Í¼£º

1¡¢Ð½¨×´Ì¬

ÓÃnew¹Ø¼ü×ÖºÍThreadÀà»òÆä×ÓÀཨÁ¢Ò»¸öÏ̶߳ÔÏóºó£¬¸ÃÏ̶߳ÔÏó¾Í´¦ÓÚÐÂÉú״̬¡£´¦ÓÚÐÂÉú״̬µÄÏß³ÌÓÐ×Ô¼ºµÄÄÚ´æ¿Õ¼ä£¬Í¨¹ýµ÷ÓÃstart·½·¨½øÈë¾ÍÐ÷״̬£¨runnable£©¡£

×¢Ò⣺²»ÄܶÔÒѾ­Æô¶¯µÄÏß³ÌÔٴε÷ÓÃstart()·½·¨£¬·ñÔò»á³öÏÖjava.lang.IllegalThreadStateExceptionÒì³£¡£

2¡¢¾ÍÐ÷״̬

´¦ÓÚ¾ÍÐ÷״̬µÄÏß³ÌÒѾ­¾ß±¸ÁËÔËÐÐÌõ¼þ£¬µ«»¹Ã»ÓзÖÅäµ½CPU£¬´¦ÓÚÏ߳̾ÍÐ÷¶ÓÁУ¨¾¡¹ÜÊDzÉÓöÓÁÐÐÎʽ£¬ÊÂʵÉÏ£¬°ÑËü³ÆÎª¿ÉÔËÐгضø²»ÊÇ¿ÉÔËÐжÓÁС£ÒòΪcpuµÄµ÷¶È²»Ò»¶¨Êǰ´ÕÕÏȽøÏȳöµÄ˳ÐòÀ´µ÷¶ÈµÄ£©£¬µÈ´ýϵͳΪÆä·ÖÅäCPU¡£µÈ´ý״̬²¢²»ÊÇÖ´ÐÐ״̬£¬µ±ÏµÍ³Ñ¡¶¨Ò»¸öµÈ´ýÖ´ÐеÄThread¶ÔÏóºó£¬Ëü¾Í»á´ÓµÈ´ýÖ´ÐÐ״̬½øÈëÖ´ÐÐ״̬£¬ÏµÍ³ÌôÑ¡µÄ¶¯×÷³ÆÖ®Îª¡°cpuµ÷¶È¡±¡£Ò»µ©»ñµÃCPU£¬Ï߳̾ͽøÈëÔËÐÐ״̬²¢×Ô¶¯µ÷ÓÃ×Ô¼ºµÄrun·½·¨¡£

Ìáʾ£ºÈç¹ûÏ£Íû×ÓÏ̵߳÷ÓÃstart()·½·¨ºóÁ¢¼´Ö´ÐУ¬¿ÉÒÔʹÓÃThread.sleep()·½Ê½Ê¹Ö÷Ïß³Ì˯ÃßÒ»»ï¶ù£¬×ªÈ¥Ö´ÐÐ×ÓÏ̡߳£

3¡¢ÔËÐÐ״̬

´¦ÓÚÔËÐÐ״̬µÄÏß³Ì×îΪ¸´ÔÓ£¬Ëü¿ÉÒÔ±äΪ×èÈû״̬¡¢¾ÍÐ÷״̬ºÍËÀÍö״̬¡£

´¦ÓÚ¾ÍÐ÷״̬µÄỊ̈߳¬Èç¹û»ñµÃÁËcpuµÄµ÷¶È£¬¾Í»á´Ó¾ÍÐ÷״̬±äΪÔËÐÐ״̬£¬Ö´ÐÐrun()·½·¨ÖеÄÈÎÎñ¡£Èç¹û¸ÃÏß³ÌʧȥÁËcpu×ÊÔ´£¬¾Í»áÓÖ´ÓÔËÐÐ״̬±äΪ¾ÍÐ÷״̬¡£ÖØÐµȴýϵͳ·ÖÅä×ÊÔ´¡£Ò²¿ÉÒÔ¶ÔÔÚÔËÐÐ״̬µÄÏ̵߳÷ÓÃyield()·½·¨£¬Ëü¾Í»áÈóöcpu×ÊÔ´£¬ÔٴαäΪ¾ÍÐ÷״̬¡£

µ±·¢ÉúÈçÏÂÇé¿öÊÇ£¬Ï̻߳á´ÓÔËÐÐ״̬±äΪ×èÈû״̬£º

¢Ù¡¢Ï̵߳÷ÓÃsleep·½·¨Ö÷¶¯·ÅÆúËùÕ¼ÓõÄϵͳ×ÊÔ´

¢Ú¡¢Ï̵߳÷ÓÃÒ»¸ö×èÈûʽIO·½·¨£¬Ôڸ÷½·¨·µ»ØÖ®Ç°£¬¸ÃÏ̱߳»×èÈû

¢Û¡¢Ïß³ÌÊÔͼ»ñµÃÒ»¸öͬ²½¼àÊÓÆ÷£¬µ«¸ü¸Äͬ²½¼àÊÓÆ÷Õý±»ÆäËûÏß³ÌËù³ÖÓÐ

¢Ü¡¢Ïß³ÌÔڵȴýij¸ö֪ͨ£¨notify£©

¢Ý¡¢³ÌÐòµ÷ÓÃÁËÏ̵߳Äsuspend·½·¨½«Ïß³Ì¹ÒÆð¡£²»¹ý¸Ã·½·¨ÈÝÒ×µ¼ÖÂËÀËø£¬ËùÒÔ³ÌÐòÓ¦¸Ã¾¡Á¿±ÜÃâʹÓø÷½·¨¡£

µ±Ï̵߳Ärun()·½·¨Ö´ÐÐÍ꣬»òÕß±»Ç¿ÖÆÐÔµØÖÕÖ¹£¬ÀýÈç³öÏÖÒì³££¬»òÕßµ÷ÓÃÁËstop()¡¢desyory()·½·¨µÈµÈ£¬¾Í»á´ÓÔËÐÐ״̬ת±äΪËÀÍö״̬¡£

4¡¢×èÈû״̬

´¦ÓÚÔËÐÐ״̬µÄÏß³ÌÔÚijЩÇé¿öÏ£¬ÈçÖ´ÐÐÁËsleep£¨Ë¯Ãߣ©·½·¨£¬»òµÈ´ýI/OÉ豸µÈ×ÊÔ´£¬½«ÈóöCPU²¢ÔÝʱֹͣ×Ô¼ºµÄÔËÐУ¬½øÈë×èÈû״̬¡£

ÔÚ×èÈû״̬µÄÏ̲߳»ÄܽøÈë¾ÍÐ÷¶ÓÁС£Ö»Óе±ÒýÆð×èÈûµÄÔ­ÒòÏû³ýʱ£¬Èç˯Ãßʱ¼äÒѵ½£¬»òµÈ´ýµÄI/OÉ豸¿ÕÏÐÏÂÀ´£¬Ï̱߳ãתÈë¾ÍÐ÷״̬£¬ÖØÐµ½¾ÍÐ÷¶ÓÁÐÖÐÅŶӵȴý£¬±»ÏµÍ³Ñ¡Öкó´ÓÔ­À´Í£Ö¹µÄλÖÿªÊ¼¼ÌÐøÔËÐС£ÓÐÈýÖÖ·½·¨¿ÉÒÔÔÝÍ£ThreadsÖ´ÐУº

5¡¢ËÀÍö״̬

µ±Ï̵߳Ärun()·½·¨Ö´ÐÐÍ꣬»òÕß±»Ç¿ÖÆÐÔµØÖÕÖ¹£¬¾ÍÈÏΪËüËÀÈ¥¡£Õâ¸öÏ̶߳ÔÏóÒ²ÐíÊÇ»îµÄ£¬µ«ÊÇ£¬ËüÒѾ­²»ÊÇÒ»¸öµ¥¶ÀÖ´ÐеÄÏ̡߳£Ïß³ÌÒ»µ©ËÀÍö£¬¾Í²»Äܸ´Éú¡£ Èç¹ûÔÚÒ»¸öËÀÈ¥µÄÏß³ÌÉϵ÷ÓÃstart()·½·¨£¬»áÅ׳öjava.lang.IllegalThreadStateExceptionÒì³£¡£

¶þ¡¢Ïß³Ì״̬µÄ¿ØÖÆ

JavaÌṩÁËһЩ±ã½ÝµÄ·½·¨ÓÃÓÚ»áÏß³Ì״̬µÄ¿ØÖÆ¡£

¿ÉÒÔ¿´µ½ºÜ¶à·½·¨£¬ÒѾ­±êעΪ¹ýʱµÄ£¬ÎÒÃÇÓ¦¸Ã¾¡¿ÉÄܵıÜÃâʹÓÃËüÃÇ£¬¶øÓ¦¸ÃÖØµã¹Ø×¢start()¡¢interrupt()¡¢join()¡¢sleep()¡¢yield()µÈÖ±½Ó¿ØÖÆ·½·¨£¬ºÍsetDaemon()¡¢setPriority()µÈ¼ä½Ó¿ØÖÆ·½·¨¡£

1¡¢Ïß³Ì˯Ãß¡ª¡ªsleep

Èç¹ûÎÒÃÇÐèÒªÈõ±Ç°ÕýÔÚÖ´ÐеÄÏß³ÌÔÝÍ£Ò»¶Îʱ¼ä£¬²¢½øÈë×èÈû״̬£¬Ôò¿ÉÒÔͨ¹ýµ÷ÓÃThreadµÄsleep·½·¨£¬´ÓÉÏÃæ¿ÉÒÔ¿´µ½sleep·½·¨ÓÐÁ½ÖÖÖØÔØµÄÐÎʽ£¬µ«ÊÇʹÓ÷½·¨Ò»Ñù¡£

±ÈÈ磬ÎÒÃÇÏëҪʹÖ÷Ïß³ÌÿÐÝÃß100ºÁÃ룬ȻºóÔÙ´òÓ¡³öÊý×Ö£º

public class Test1 {  
public static void main(String[] args) throws InterruptedException {
for(int i=0;i<100;i++){
System.out.println("main"+i);
Thread.sleep(100);
}
}
}

¿ÉÒÔÃ÷ÏÔ¿´µ½´òÓ¡µÄÊý×ÖÔÚʱ¼äÉÏÓÐЩÐíµÄ¼ä¸ô¡£

×¢ÒâÈçϼ¸µãÎÊÌâ

¢Ù¡¢sleepÊǾ²Ì¬·½·¨£¬×îºÃ²»ÒªÓÃThreadµÄʵÀý¶ÔÏóµ÷ÓÃËü£¬ÒòΪËü˯ÃßµÄʼÖÕÊǵ±Ç°ÕýÔÚÔËÐеÄỊ̈߳¬¶ø²»Êǵ÷ÓÃËüµÄÏ̶߳ÔÏó£¬ËüÖ»¶ÔÕýÔÚÔËÐÐ״̬µÄÏ̶߳ÔÏóÓÐЧ¡£¿´ÏÂÃæµÄÀý×Ó£º

public class Test1 {  
public static void main(String[] args) throws InterruptedException {
System.out.println(Thread.currentThread().getName());
MyThread myThread=new MyThread();
myThread.start();
myThread.sleep(1000);//ÕâÀïsleepµÄ¾ÍÊÇmainỊ̈߳¬¶ø·ÇmyThreadÏß³Ì
Thread.sleep(10);
for(int i=0;i<100;i++){
System.out.println("main"+i);
}
}
}

¢Ú¡¢JavaÏ̵߳÷¶ÈÊÇJava¶àÏ̵߳ĺËÐÄ£¬Ö»ÓÐÁ¼ºÃµÄµ÷¶È£¬²ÅÄܳä·Ö·¢»ÓϵͳµÄÐÔÄÜ£¬Ìá¸ß³ÌÐòµÄÖ´ÐÐЧÂÊ¡£µ«ÊDz»¹Ü³ÌÐòÔ±Ôõô±àдµ÷¶È£¬Ö»ÄÜ×î´óÏ޶ȵÄÓ°ÏìÏß³ÌÖ´ÐеĴÎÐò£¬¶ø²»ÄÜ×öµ½¾«×¼¿ØÖÆ¡£ÒòΪʹÓÃsleep·½·¨Ö®ºó£¬Ïß³ÌÊǽøÈë×èÈû״̬µÄ£¬Ö»Óе±Ë¯ÃßµÄʱ¼ä½áÊø£¬²Å»áÖØÐ½øÈëµ½¾ÍÐ÷״̬£¬¶ø¾ÍÐ÷״̬½øÈëµ½ÔËÐÐ״̬£¬ÊÇÓÉϵͳ¿ØÖƵģ¬ÎÒÃDz»¿ÉÄܾ«×¼µÄÈ¥¸ÉÉæËü£¬ËùÒÔÈç¹ûµ÷ÓÃThread.sleep(1000)ʹµÃÏß³Ì˯Ãß1Ã룬¿ÉÄܽá¹û»á´óÓÚ1Ãë¡£

public class Test1 {  
public static void main(String[] args) throws InterruptedException {
new MyThread().start();
new MyThread().start();
}
}

class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(this.getName()+"Ïß³Ì" + i + "´ÎÖ´ÐУ¡");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

¿´Ä³Ò»´ÎµÄÔËÐнá¹û£º

Thread-0Ïß³Ì0´ÎÖ´ÐУ¡  
Thread-1Ïß³Ì0´ÎÖ´ÐУ¡
Thread-1Ïß³Ì1´ÎÖ´ÐУ¡
Thread-0Ïß³Ì1´ÎÖ´ÐУ¡
Thread-0Ïß³Ì2´ÎÖ´ÐУ¡
Thread-1Ïß³Ì2´ÎÖ´ÐУ¡

¿ÉÒÔ¿´µ½£¬Ïß³Ì0Ê×ÏÈÖ´ÐУ¬È»ºóÏß³Ì1Ö´ÐÐÒ»´Î£¬ÓÖÁËÖ´ÐÐÒ»´Î¡£¿ÉÒÔ¿´µ½Ëü²¢²»Êǰ´ÕÕsleepµÄ˳ÐòÖ´Ðеġ£

2¡¢Ïß³ÌÈò½¡ª¡ªyield

yield()·½·¨ºÍsleep()·½·¨ÓеãÏàËÆ£¬ËüÒ²ÊÇThreadÀàÌṩµÄÒ»¸ö¾²Ì¬µÄ·½·¨£¬ËüÒ²¿ÉÒÔÈõ±Ç°ÕýÔÚÖ´ÐеÄÏß³ÌÔÝÍ££¬Èóöcpu×ÊÔ´¸øÆäËûµÄÏ̡߳£µ«ÊǺÍsleep()·½·¨²»Í¬µÄÊÇ£¬Ëü²»»á½øÈëµ½×èÈû״̬£¬¶øÊǽøÈëµ½¾ÍÐ÷״̬¡£yield()·½·¨Ö»ÊÇÈõ±Ç°Ïß³ÌÔÝͣһϣ¬ÖØÐ½øÈë¾ÍÐ÷µÄÏ̳߳ØÖУ¬ÈÃϵͳµÄÏ̵߳÷¶ÈÆ÷ÖØÐµ÷¶ÈÆ÷ÖØÐµ÷¶ÈÒ»´Î£¬ÍêÈ«¿ÉÄܳöÏÖÕâÑùµÄÇé¿ö£ºµ±Ä³¸öÏ̵߳÷ÓÃyield()·½·¨Ö®ºó£¬Ï̵߳÷¶ÈÆ÷ÓÖ½«Æäµ÷¶È³öÀ´ÖØÐ½øÈëµ½ÔËÐÐ״ִ̬ÐС£

ʵ¼ÊÉÏ£¬µ±Ä³¸öÏ̵߳÷ÓÃÁËyield()·½·¨ÔÝÍ£Ö®ºó£¬ÓÅÏȼ¶Ó뵱ǰÏß³ÌÏàͬ£¬»òÕßÓÅÏȼ¶±Èµ±Ç°Ï̸߳ü¸ßµÄ¾ÍÐ÷״̬µÄÏ̸߳üÓпÉÄÜ»ñµÃÖ´ÐеĻú»á£¬µ±È»£¬Ö»ÊÇÓпÉÄÜ£¬ÒòΪÎÒÃDz»¿ÉÄܾ«È·µÄ¸ÉÉæcpuµ÷¶ÈÏ̡߳£

yieldµÄÓ÷¨£º

public class Test1 {  
public static void main(String[] args) throws InterruptedException {
new MyThread("µÍ¼¶", 1).start();
new MyThread("Öм¶", 5).start();
new MyThread("¸ß¼¶", 10).start();
}
}

class MyThread extends Thread {
public MyThread(String name, int pro) {
super(name);// ÉèÖÃÏ̵߳ÄÃû³Æ
this.setPriority(pro);// ÉèÖÃÓÅÏȼ¶
}

@Override
public void run() {
for (int i = 0; i < 30; i++) {
System.out.println(this.getName() + "Ï̵߳Ú" + i + "´ÎÖ´ÐУ¡");
if (i % 5 == 0)
Thread.yield();
}
}
}

¹ØÓÚsleep()·½·¨ºÍyield()·½µÄÇø±ðÈçÏ£º

¢Ù¡¢sleep·½·¨ÔÝÍ£µ±Ç°Ïß³Ìºó£¬»á½øÈë×èÈû״̬£¬Ö»Óе±Ë¯Ãßʱ¼äµ½ÁË£¬²Å»áתÈë¾ÍÐ÷״̬¡£¶øyield·½·¨µ÷ÓÃºó £¬ÊÇÖ±½Ó½øÈë¾ÍÐ÷״̬£¬ËùÒÔÓпÉÄܸսøÈë¾ÍÐ÷״̬£¬ÓÖ±»µ÷¶Èµ½ÔËÐÐ״̬¡£

¢Ú¡¢sleep·½·¨ÉùÃ÷Å׳öÁËInterruptedException£¬ËùÒÔµ÷ÓÃsleep·½·¨µÄʱºòÒª²¶»ñ¸ÃÒì³££¬»òÕßÏÔʾÉùÃ÷Å׳ö¸ÃÒì³£¡£¶øyield·½·¨ÔòûÓÐÉùÃ÷Å׳öÈÎÎñÒì³£¡£

¢Û¡¢sleep·½·¨±Èyield·½·¨ÓиüºÃµÄ¿ÉÒÆÖ²ÐÔ£¬Í¨³£²»ÒªÒÀ¿¿yield·½·¨À´¿ØÖƲ¢·¢Ï̵߳ÄÖ´ÐС£

3¡¢Ï̺߳ϲ¢¡ª¡ªjoin

Ï̵߳ĺϲ¢µÄº¬Òå¾ÍÊǽ«¼¸¸ö²¢ÐÐÏ̵߳ÄÏ̺߳ϲ¢ÎªÒ»¸öµ¥Ïß³ÌÖ´ÐУ¬Ó¦Óó¡¾°Êǵ±Ò»¸öÏ̱߳ØÐëµÈ´ýÁíÒ»¸öÏß³ÌÖ´ÐÐÍê±Ï²ÅÄÜÖ´ÐÐʱ£¬ThreadÀàÌṩÁËjoin·½·¨À´Íê³ÉÕâ¸ö¹¦ÄÜ£¬×¢Ò⣬Ëü²»ÊǾ²Ì¬·½·¨¡£

´ÓÉÏÃæµÄ·½·¨µÄÁбí¿ÉÒÔ¿´µ½£¬ËüÓÐ3¸öÖØÔØµÄ·½·¨£º

void join()

µ±Ç°Ï̵߳ȸüÓÈë¸ÃÏ̺߳óÃæ£¬µÈ´ý¸ÃÏß³ÌÖÕÖ¹¡£

void join(long millis)

µ±Ç°Ï̵߳ȴý¸ÃÏß³ÌÖÕÖ¹µÄʱ¼ä×Ϊ millis ºÁÃë¡£ Èç¹ûÔÚmillisʱ¼äÄÚ£¬¸ÃÏß³ÌûÓÐÖ´ÐÐÍ꣬ÄÇôµ±Ç°Ï߳̽øÈë¾ÍÐ÷״̬£¬ÖØÐµȴýcpuµ÷¶È

void join(long millis,int nanos)

µÈ´ý¸ÃÏß³ÌÖÕÖ¹µÄʱ¼ä×Ϊ millis ºÁÃë + nanos ÄÉÃë¡£Èç¹ûÔÚmillisʱ¼äÄÚ£¬¸ÃÏß³ÌûÓÐÖ´ÐÐÍ꣬ÄÇôµ±Ç°Ï߳̽øÈë¾ÍÐ÷״̬£¬ÖØÐµȴýcpuµ÷¶È

Àý×Ó£º

public class Test1 {  
public static void main(String[] args) throws InterruptedException {
MyThread thread=new MyThread();
thread.start();
thread.join(1);//½«Ö÷Ï̼߳ÓÈëµ½×ÓÏ̺߳óÃæ£¬ ²»¹ýÈç¹û×ÓÏß³ÌÔÚ1ºÁÃëʱ¼äÄÚûִÐÐÍ꣬ ÔòÖ÷Ï̱߳㲻ÔٵȴýËüÖ´ÐÐÍ꣬½øÈë¾ÍÐ÷״̬£¬µÈ´ýcpuµ÷¶È
for(int i=0;i<30;i++){
System.out.println(Thread.currentThread().getName() + "Ï̵߳Ú" + i + "´ÎÖ´ÐУ¡");
}
}
}

class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(this.getName() + "Ï̵߳Ú" + i + "´ÎÖ´ÐУ¡");
}
}
}

ÔÚÕâ¸öÀý×ÓÖУ¬ÔÚÖ÷Ïß³ÌÖе÷ÓÃthread.join(); ¾ÍÊǽ«Ö÷Ï̼߳ÓÈëµ½thread×ÓÏ̺߳óÃæµÈ´ýÖ´ÐС£²»¹ýÓÐʱ¼äÏÞÖÆ£¬Îª1ºÁÃë¡£

4¡¢Ï̵߳ÄÓÅÏȼ¶

ÿ¸öÏß³ÌÖ´ÐÐʱ¶¼ÓÐÒ»¸öÓÅÏȼ¶µÄÊôÐÔ£¬ÓÅÏȼ¶¸ßµÄÏ߳̿ÉÒÔ»ñµÃ½Ï¶àµÄÖ´Ðлú»á£¬¶øÓÅÏȼ¶µÍµÄÏß³ÌÔò»ñµÃ½ÏÉÙµÄÖ´Ðлú»á¡£ÓëÏß³ÌÐÝÃßÀàËÆ£¬Ï̵߳ÄÓÅÏȼ¶ÈÔÈ»ÎÞ·¨±£ÕÏÏ̵߳ÄÖ´ÐдÎÐò¡£Ö»²»¹ý£¬ÓÅÏȼ¶¸ßµÄÏ̻߳ñÈ¡CPU×ÊÔ´µÄ¸ÅÂʽϴó£¬ÓÅÏȼ¶µÍµÄÒ²²¢·Çû»ú»áÖ´ÐС£

ÿ¸öÏß³ÌĬÈϵÄÓÅÏȼ¶¶¼Óë´´½¨ËüµÄ¸¸Ï߳̾ßÓÐÏàͬµÄÓÅÏȼ¶£¬ÔÚĬÈÏÇé¿öÏ£¬mainÏ߳̾ßÓÐÆÕͨÓÅÏȼ¶¡£

ThreadÀàÌṩÁËsetPriority(int newPriority)ºÍgetPriority()·½·¨À´ÉèÖúͷµ»ØÒ»¸öÖ¸¶¨Ï̵߳ÄÓÅÏȼ¶£¬ÆäÖÐsetPriority·½·¨µÄ²ÎÊýÊÇÒ»¸öÕûÊý£¬·¶Î§ÊÇ1~¡¤0Ö®¼ä£¬Ò²¿ÉÒÔʹÓÃThreadÀàÌṩµÄÈý¸ö¾²Ì¬³£Á¿£º

MAX_PRIORITY   =10
MIN_PRIORITY =1
NORM_PRIORITY =5

Àý×Ó£º

public class Test1 {  
public static void main(String[] args) throws InterruptedException {
new MyThread("¸ß¼¶", 10).start();
new MyThread("µÍ¼¶", 1).start();
}
}

class MyThread extends Thread {
public MyThread(String name,int pro) {
super(name);//ÉèÖÃÏ̵߳ÄÃû³Æ
setPriority(pro);//ÉèÖÃÏ̵߳ÄÓÅÏȼ¶
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(this.getName() + "Ï̵߳Ú" + i + "´ÎÖ´ÐУ¡");
}
}
}

´Ó½á¹û¿ÉÒÔ¿´µ½ £¬Ò»°ãÇé¿öÏ£¬¸ß¼¶Ï̸߳üÏÔÖ´ÐÐÍê±Ï¡£

×¢ÒâÒ»µã£ºËäÈ»JavaÌṩÁË10¸öÓÅÏȼ¶±ð£¬µ«ÕâЩÓÅÏȼ¶±ðÐèÒª²Ù×÷ϵͳµÄÖ§³Ö¡£²»Í¬µÄ²Ù×÷ϵͳµÄÓÅÏȼ¶²¢²»Ïàͬ£¬¶øÇÒÒ²²»ÄܺܺõĺÍJavaµÄ10¸öÓÅÏȼ¶±ð¶ÔÓ¦¡£ËùÒÔÎÒÃÇÓ¦¸ÃʹÓÃMAX_PRIORITY¡¢MIN_PRIORITYºÍNORM_PRIORITYÈý¸ö¾²Ì¬³£Á¿À´É趨ÓÅÏȼ¶£¬ÕâÑù²ÅÄܱ£Ö¤³ÌÐò×îºÃµÄ¿ÉÒÆÖ²ÐÔ¡£

5¡¢ÊØ»¤Ïß³Ì

ÊØ»¤Ïß³ÌÓëÆÕͨÏß³Ìд·¨ÉÏ»ù±¾Ã´É¶Çø±ð£¬µ÷ÓÃÏ̶߳ÔÏóµÄ·½·¨setDaemon(true)£¬Ôò¿ÉÒÔ½«ÆäÉèÖÃÎªÊØ»¤Ï̡߳£

ÊØ»¤Ïß³ÌʹÓõÄÇé¿ö½ÏÉÙ£¬µ«²¢·ÇÎÞÓ㬾ÙÀýÀ´Ëµ£¬JVMµÄÀ¬»ø»ØÊÕ¡¢ÄÚ´æ¹ÜÀíµÈÏ̶߳¼ÊÇÊØ»¤Ï̡߳£»¹ÓоÍÊÇÔÚ×öÊý¾Ý¿âÓ¦ÓÃʱºò£¬Ê¹ÓõÄÊý¾Ý¿âÁ¬½Ó³Ø£¬Á¬½Ó³Ø±¾ÉíÒ²°üº¬×źܶàºǫ́Ị̈߳¬¼à¿ØÁ¬½Ó¸öÊý¡¢³¬Ê±Ê±¼ä¡¢×´Ì¬µÈµÈ¡£

setDaemon·½·¨µÄÏêϸ˵Ã÷£º

public final void setDaemon(boolean on)½«¸ÃÏ̱߳ê¼ÇÎªÊØ»¤Ï̻߳òÓû§Ï̡߳£µ±ÕýÔÚÔËÐеÄÏ̶߳¼ÊÇÊØ»¤Ïß³Ìʱ£¬Java ÐéÄâ»úÍ˳ö¡£
¸Ã·½·¨±ØÐëÔÚÆô¶¯Ïß³Ìǰµ÷Óᣠ¸Ã·½·¨Ê×Ïȵ÷ÓøÃÏß³ÌµÄ checkAccess ·½·¨£¬ÇÒ²»´øÈκβÎÊý¡£Õâ¿ÉÄÜÅ׳ö SecurityException£¨ÔÚµ±Ç°Ïß³ÌÖУ©¡£

²ÎÊý£º

on - Èç¹ûΪ true£¬Ôò½«¸ÃÏ̱߳ê¼ÇÎªÊØ»¤Ï̡߳£

Å׳ö£º

IllegalThreadStateException - Èç¹û¸ÃÏ̴߳¦Óڻ״̬¡£

SecurityException - Èç¹ûµ±Ç°Ïß³ÌÎÞ·¨Ð޸ĸÃÏß³Ì

/** 
* JavaỊ̈߳ºÏ̵߳ĵ÷¶È-ÊØ»¤Ïß³Ì
*/
public class Test {
public static void main(String[] args) {
Thread t1 = new MyCommon();
Thread t2 = new Thread(new MyDaemon());
t2.setDaemon(true); //ÉèÖÃÎªÊØ»¤Ïß³Ì

t2.start();
t1.start();
}
}

class MyCommon extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Ïß³Ì1µÚ" + i + "´ÎÖ´ÐУ¡");
try {
Thread.sleep(7);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

class MyDaemon implements Runnable {
public void run() {
for (long i = 0; i < 9999999L; i++) {
System.out.println("ºǫ́Ï̵߳Ú" + i + "´ÎÖ´ÐУ¡");
try {
Thread.sleep(7);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

Ö´Ðнá¹û£º

ºǫ́Ï̵߳Ú0´ÎÖ´ÐУ¡  
Ïß³Ì1µÚ0´ÎÖ´ÐУ¡
Ïß³Ì1µÚ1´ÎÖ´ÐУ¡
ºǫ́Ï̵߳Ú1´ÎÖ´ÐУ¡
ºǫ́Ï̵߳Ú2´ÎÖ´ÐУ¡
Ïß³Ì1µÚ2´ÎÖ´ÐУ¡
Ïß³Ì1µÚ3´ÎÖ´ÐУ¡
ºǫ́Ï̵߳Ú3´ÎÖ´ÐУ¡
Ïß³Ì1µÚ4´ÎÖ´ÐУ¡
ºǫ́Ï̵߳Ú4´ÎÖ´ÐУ¡
ºǫ́Ï̵߳Ú5´ÎÖ´ÐУ¡
ºǫ́Ï̵߳Ú6´ÎÖ´ÐУ¡
ºǫ́Ï̵߳Ú7´ÎÖ´ÐУ¡

´ÓÉÏÃæµÄÖ´Ðнá¹û¿ÉÒÔ¿´³ö£ºÇ°Ì¨Ïß³ÌÊDZ£Ö¤Ö´ÐÐÍê±ÏµÄ£¬ºǫ́Ï̻߳¹Ã»ÓÐÖ´ÐÐÍê±Ï¾ÍÍ˳öÁË¡£

ʵ¼ÊÉÏ£ºJREÅжϳÌÐòÊÇ·ñÖ´ÐнáÊøµÄ±ê×¼ÊÇËùÓеÄǰִ̨Ïß³ÌÐÐÍê±ÏÁË£¬¶ø²»¹Üºǫ́Ï̵߳Ä״̬£¬Òò´Ë£¬ÔÚʹÓúóÌ¨ÏØ³ÇʱºòÒ»¶¨Òª×¢ÒâÕâ¸öÎÊÌâ¡£

ÊØ»¤Ï̵߳ÄÓÃ;£º

ÊØ»¤Ïß³Ìͨ³£ÓÃÓÚÖ´ÐÐһЩºǫ́×÷Òµ£¬ÀýÈçÔÚÄãµÄÓ¦ÓóÌÐòÔËÐÐʱ²¥·Å±³¾°ÒôÀÖ£¬ÔÚÎÄ×ֱ༭Æ÷Àï×ö×Ô¶¯Óï·¨¼ì²é¡¢×Ô¶¯±£´æµÈ¹¦ÄÜ¡£JavaµÄÀ¬»ø»ØÊÕÒ²ÊÇÒ»¸öÊØ»¤Ï̡߳£

ÊØ»¤Ïߵĺô¦¾ÍÊÇÄã²»ÐèÒª¹ØÐÄËüµÄ½áÊøÎÊÌâ¡£ÀýÈçÄãÔÚÄãµÄÓ¦ÓóÌÐòÔËÐеÄʱºòÏ£Íû²¥·Å±³¾°ÒôÀÖ£¬Èç¹û½«Õâ¸ö²¥·Å±³¾°ÒôÀÖµÄÏß³ÌÉ趨Ϊ·ÇÊØ»¤Ị̈߳¬ÄÇôÔÚÓû§ÇëÇóÍ˳öµÄʱºò£¬²»½öÒªÍ˳öÖ÷Ị̈߳¬»¹ÒªÍ¨Öª²¥·Å±³¾°ÒôÀÖµÄÏß³ÌÍ˳ö£»Èç¹ûÉè¶¨ÎªÊØ»¤Ïß³ÌÔò²»ÐèÒªÁË¡£

6¡¢ÈçºÎ½áÊøÒ»¸öÏß³Ì

Thread.stop()¡¢Thread.suspend¡¢Thread.resume¡¢Runtime.runFinalizersOnExitÕâЩÖÕÖ¹Ïß³ÌÔËÐеķ½·¨ÒѾ­±»·ÏÆúÁË£¬Ê¹ÓÃËüÃÇÊǼ«¶Ë²»°²È«µÄ£¡ÏëÒª°²È«ÓÐЧµÄ½áÊøÒ»¸öỊ̈߳¬¿ÉÒÔʹÓÃÏÂÃæµÄ·½·¨¡£

1¡¢Õý³£Ö´ÐÐÍêrun·½·¨£¬È»ºó½áÊøµô

2¡¢¿ØÖÆÑ­»·Ìõ¼þºÍÅжÏÌõ¼þµÄ±êʶ·ûÀ´½áÊøµôÏß³Ì

±ÈÈç˵run·½·¨ÕâÑùд£º

class MyThread extends Thread {  
int i=0;
@Override
public void run() {
while (true) {
if(i==10)
break;
i++;
System.out.println(i);

}
}
}

»òÕß

class MyThread extends Thread {  
int i=0;
boolean next=true;
@Override
public void run() {
while (next) {
if(i==10)
next=false;
i++;
System.out.println(i);
}
}
}

»òÕß

class MyThread extends Thread {  
int i=0;
@Override
public void run() {
while (true) {
if(i==10)
return;
i++;
System.out.println(i);
}
}
}

Ö»Òª±£Ö¤ÔÚÒ»¶¨µÄÇé¿öÏ£¬run·½·¨Äܹ»Ö´ÐÐÍê±Ï¼´¿É¡£¶ø²»ÊÇwhile(true)µÄÎÞÏßÑ­»·¡£

3¡¢Ê¹ÓÃinterrupt½áÊøÒ»¸öÏ̡߳£

³ÏÈ»£¬Ê¹ÓõÚ2Öз½·¨µÄ±êʶ·ûÀ´½áÊøÒ»¸öỊ̈߳¬ÊÇÒ»¸ö²»´íµÄ·½·¨£¬µ«ÊÇÈç¹û£¬¸ÃÏß³ÌÊÇ´¦ÓÚsleep¡¢wait¡¢joinµÄ״̬µÄʱºò£¬whileÑ­»·¾Í²»»áÖ´ÐУ¬ÄÇôÎÒÃǵıêʶ·û¾ÍÎÞÓÃÎäÖ®µØÁË£¬µ±È»Ò²²»ÄÜÔÙͨ¹ýËüÀ´½áÊø´¦ÓÚÕâ3ÖÖ״̬µÄÏß³ÌÁË¡£

¿ÉÒÔʹÓÃinterruptÕâ¸öÇÉÃîµÄ·½Ê½½áÊøµôÕâ¸öÏ̡߳£

ÎÒÃÇ¿´¿´sleep¡¢wait¡¢join·½·¨µÄÉùÃ÷£º

public final void wait() throws InterruptedException  

public static native void sleep(long millis) throws InterruptedException 

public final void join() throws InterruptedException  

¿ÉÒÔ¿´µ½£¬ÕâÈýÕßÓÐÒ»¸ö¹²Í¬µã£¬¶¼Å׳öÁËÒ»¸öInterruptedExceptionµÄÒì³£¡£

ÔÚʲôʱºò»á²úÉúÕâÑùÒ»¸öÒì³£ÄØ£¿

ÿ¸öThread¶¼ÓÐÒ»¸öÖжÏ״״̬£¬Ä¬ÈÏΪfalse¡£¿ÉÒÔͨ¹ýThread¶ÔÏóµÄisInterrupted()·½·¨À´ÅжϸÃÏ̵߳ÄÖжÏ״̬¡£¿ÉÒÔͨ¹ýThread¶ÔÏóµÄinterrupt()·½·¨½«ÖжÏ״̬ÉèÖÃΪtrue¡£

µ±Ò»¸öÏ̴߳¦ÓÚsleep¡¢wait¡¢joinÕâÈýÖÖ״̬֮һµÄʱºò£¬Èç¹û´ËʱËûµÄÖжÏ״̬Ϊtrue£¬ÄÇôËü¾Í»áÅ׳öÒ»¸öInterruptedExceptionµÄÒì³££¬²¢½«ÖжÏ×´Ì¬ÖØÐÂÉèÖÃΪfalse¡£

¿´ÏÂÃæµÄ¼òµ¥µÄÀý×Ó£º

public class Test1 {  
public static void main(String[] args) throws InterruptedException {
MyThread thread=new MyThread();
thread.start();
}
}

class MyThread extends Thread {
int i=1;
@Override
public void run() {
while (true) {
System.out.println(i);
System.out.println(this.isInterrupted());
try {
System.out.println("ÎÒÂíÉÏÈ¥sleepÁË");
Thread.sleep(2000);
this.interrupt();
} catch (InterruptedException e) {
System.out.println("Òì³£²¶»ñÁË"+this.isInterrupted());
return;
}
i++;
}
}
}

²âÊÔ½á¹û£º

1  
false
ÎÒÂíÉÏÈ¥sleepÁË
2
true
ÎÒÂíÉÏÈ¥sleepÁË
Òì³£²¶»ñÁËfalse

¿ÉÒÔ¿´µ½£¬Ê×ÏÈÖ´ÐеÚÒ»´ÎwhileÑ­»·£¬ÔÚµÚÒ»´ÎÑ­»·ÖУ¬Ë¯Ãß2Ã룬Ȼºó½«ÖжÏ״̬ÉèÖÃΪtrue¡£µ±½øÈëµ½µÚ¶þ´ÎÑ­»·µÄʱºò£¬ÖжÏ״̬¾ÍÊǵÚÒ»´ÎÉèÖõÄtrue£¬µ±ËüÔٴνøÈësleepµÄʱºò£¬ÂíÉϾÍÅ׳öÁËInterruptedExceptionÒì³££¬È»ºó±»ÎÒÃDz¶»ñÁË¡£È»ºóÖжÏ״̬ÓÖ±»ÖØÐÂ×Ô¶¯ÉèÖÃΪfalseÁË£¨´Ó×îºóÒ»ÌõÊä³ö¿ÉÒÔ¿´³öÀ´£©¡£

ËùÒÔ£¬ÎÒÃÇ¿ÉÒÔʹÓÃinterrupt·½·¨½áÊøÒ»¸öÏ̡߳£¾ßÌåʹÓÃÈçÏ£º

public class Test1 {  
public static void main(String[] args) throws InterruptedException {
MyThread thread=new MyThread();
thread.start();
Thread.sleep(3000);
thread.interrupt();
}
}

class MyThread extends Thread {
int i=0;
@Override
public void run() {
while (true) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("ÖжÏÒì³£±»²¶»ñÁË");
return;
}
i++;
}
}
}

¶à²âÊÔ¼¸´Î£¬»á·¢ÏÖÒ»°ãÓÐÁ½ÖÖÖ´Ðнá¹û£º

0  
1
2
ÖжÏÒì³£±»²¶»ñÁË

»òÕß

0  
1
2
3
ÖжÏÒì³£±»²¶»ñÁË

ÕâÁ½ÖÖ½á¹ûǡǡ˵Ã÷ÁË Ö»ÒªÒ»¸öÏ̵߳ÄÖжÏ״̬һµ©Îªtrue£¬Ö»ÒªËü½øÈësleepµÈ״̬£¬»òÕß´¦ÓÚsleep״̬£¬Á¢Âí»ØÅ׳öInterruptedExceptionÒì³£¡£

µÚÒ»ÖÖÇé¿ö£¬Êǵ±Ö÷Ï̴߳Ó3Ãë˯Ãß״̬ÐÑÀ´Ö®ºó£¬µ÷ÓÃÁË×ÓÏ̵߳Äinterrupt·½·¨£¬´Ëʱ×ÓÏß³ÌÕý´¦ÓÚsleep״̬£¬Á¢ÂíÅ׳öInterruptedExceptionÒì³£¡£

µÚÒ»ÖÖÇé¿ö£¬Êǵ±Ö÷Ï̴߳Ó3Ãë˯Ãß״̬ÐÑÀ´Ö®ºó£¬µ÷ÓÃÁË×ÓÏ̵߳Äinterrupt·½·¨£¬´Ëʱ×ÓÏ̻߳¹Ã»Óд¦ÓÚsleep״̬¡£È»ºóÔÙµÚ3´ÎwhileÑ­»·µÄʱºò£¬Ôڴ˽øÈësleep״̬£¬Á¢ÂíÅ׳öInterruptedExceptionÒì³£¡£

Java¶àỊ̈߳¨Èý£©¡¢Ïß³Ìͬ²½

ÔÚ֮ǰ£¬ÒѾ­Ñ§Ï°µ½ÁËÏ̵߳Ĵ´½¨ºÍ״̬¿ØÖÆ£¬µ«ÊÇÿ¸öÏß³ÌÖ®¼ä¼¸ºõ¶¼Ã»ÓÐʲô̫´óµÄÁªÏµ¡£¿ÉÊÇÓеÄʱºò£¬¿ÉÄÜ´æÔÚ¶à¸öÏ̶߳àͬһ¸öÊý¾Ý½øÐвÙ×÷£¬ÕâÑù£¬¿ÉÄܾͻáÒýÓø÷ÖÖÆæ¹ÖµÄÎÊÌâ¡£ÏÖÔÚ¾ÍÀ´Ñ§Ï°¶àÏ̶߳ÔÊý¾Ý·ÃÎʵĿØÖưɡ£

ÓÉÓÚͬһ½ø³ÌµÄ¶à¸öÏ̹߳²ÏíͬһƬ´æ´¢¿Õ¼ä£¬ÔÚ´øÀ´·½±ãµÄͬʱ£¬Ò²´øÀ´ÁË·ÃÎʳåÍ»Õâ¸öÑÏÖØµÄÎÊÌâ¡£JavaÓïÑÔÌṩÁËרÃÅ»úÖÆÒÔ½â¾öÕâÖÖ³åÍ»£¬ÓÐЧ±ÜÃâÁËͬһ¸öÊý¾Ý¶ÔÏó±»¶à¸öÏß³Ìͬʱ·ÃÎÊ¡£

Ò»¡¢¶àÏß³ÌÒýÆðµÄÊý¾Ý·ÃÎʰ²È«ÎÊÌâ

ÏÂÃæ¿´Ò»¸ö¾­µäµÄÎÊÌâ£¬ÒøÐÐȡǮµÄÎÊÌ⣺

1£©¡¢ÄãÓÐÒ»ÕÅÒøÐп¨£¬ÀïÃæÓÐ5000¿éÇ®£¬È»ºóÄ㵽ȡ¿î»úÈ¡¿î£¬È¡³ö3000£¬µ±ÕýÔÚÈ¡µÄʱºò£¬È¡¿î»úÒѾ­²éѯµ½ÄãÓÐ5000¿éÇ®£¬È»ºóÕý×¼±¸¼õÈ¥300¿éÇ®µÄʱºò

2£©¡¢ÄãµÄÀÏÆÅÄÃ×ÅÄÇÕÅÒøÐп¨¶ÔÓ¦µÄ´æÕÛµ½ÒøÐÐȡǮ£¬Ò²ÒªÈ¡3000.È»ºóÒøÐеÄϵͳ²éѯ£¬´æÕÛÕË»§ÀﻹÓÐ6000£¨ÒòΪÉÏÃæÇ®»¹Ã»¿Û£©£¬ËùÒÔËüÒ²×¼±¸¼õÈ¥3000£¬

3£©¡¢ÄãµÄ¿¨ÀïÃæ¼õÈ¥3000£¬5000-3000=2000£¬²¢ÇÒÄãÀÏÆÅµÄ´æÕÛÒ²ÊÇ5000-3000=2000¡£

4£©¡¢½á¹û£¬ÄãÃÇÒ»¹²È¡ÁË6000£¬µ«ÊÇ¿¨ÀﻹʣÏÂ2000¡£

ÏÂÃæ¿´³ÌÐòµÄÄ£Äâ¹ý³Ì£º

package com.tao.test;  

public class GetMoneyTest {
public static void main(String[] args) {
Account account = new Account(5000);
GetMoneyRun runnable = new GetMoneyRun(account);
new Thread(runnable, "Äã").start();
new Thread(runnable, "ÄãÀÏÆÅ").start();
}
}

// ÕË»§Mode
class Account {
private int money;

public Account(int money) {
super();
this.money = money;
}

public int getMoney() {
return money;
}

public void setMoney(int money) {
this.money = money;
}

}
//runnableÀà
class GetMoneyRun implements Runnable {
private Account account;

public GetMoneyRun(Account account) {
this.account = account;
}

@Override
public void run() {
if (account.getMoney() > 3000) {
System.out.println(Thread.currentThread().getName() + "µÄÕË»§ÓÐ"
+ account.getMoney() + "Ôª");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
int lasetMoney=account.getMoney() - 3000;
account.setMoney(lasetMoney);
System.out.println(Thread.currentThread().getName() + "È¡³öÀ´ÁË3000Ôª"
+ Thread.currentThread().getName() + "µÄÕË»§»¹ÓÐ"
+ account.getMoney() + "Ôª");

} else {
System.out.println("Óà¶î²»×ã3000" + Thread.currentThread().getName()
+ "µÄÕË»§Ö»ÓÐ" + account.getMoney() + "Ôª");
}

}

}

¶à´ÎÔËÐгÌÐò£¬¿ÉÒÔ¿´µ½ÓжàÖÖ²»Í¬µÄ½á¹û£¬ÏÂÃæÊÇÆäÖеÄÈýÖÖ£º

ÄãµÄÕË»§ÓÐ5000Ôª  
ÄãÀÏÆÅµÄÕË»§ÓÐ5000Ôª
ÄãÀÏÆÅÈ¡³öÀ´ÁË3000ÔªÄãÀÏÆÅµÄÕË»§»¹ÓÐ2000Ôª
ÄãÈ¡³öÀ´ÁË3000ÔªÄãµÄÕË»§»¹ÓÐ-1000Ôª

ÄãµÄÕË»§ÓÐ5000Ôª  
ÄãÀÏÆÅµÄÕË»§ÓÐ5000Ôª
ÄãÀÏÆÅÈ¡³öÀ´ÁË3000ÔªÄãÀÏÆÅµÄÕË»§»¹ÓÐ-1000Ôª
ÄãÈ¡³öÀ´ÁË3000ÔªÄãµÄÕË»§»¹ÓÐ-1000Ôª

ÄãµÄÕË»§ÓÐ5000Ôª  
ÄãÀÏÆÅµÄÕË»§ÓÐ5000Ôª
ÄãÀÏÆÅÈ¡³öÀ´ÁË3000ÔªÄãÀÏÆÅµÄÕË»§»¹ÓÐ2000Ôª
ÄãÈ¡³öÀ´ÁË3000ÔªÄãµÄÕË»§»¹ÓÐ2000Ôª

¿ÉÒÔ¿´µ½£¬ÓÉÓÚÓÐÁ½¸öÏß³Ìͬʱ·ÃÎÊÕâ¸öaccount¶ÔÏ󣬵¼ÖÂȡǮ·¢ÉúµÄÕË»§·¢ÉúÎÊÌâ¡£µ±¶à¸öÏ̷߳ÃÎÊͬһ¸öÊý¾ÝµÄʱºò£¬·Ç³£ÈÝÒ×Òý·¢ÎÊÌ⡣ΪÁ˱ÜÃâÕâÑùµÄÊÂÇé·¢Éú£¬ÎÒÃÇÒª±£Ö¤Ïß³Ìͬ²½»¥³â£¬Ëùνͬ²½»¥³â¾ÍÊÇ£º²¢·¢Ö´ÐеĶà¸öÏß³ÌÔÚijһʱ¼äÄÚÖ»ÔÊÐíÒ»¸öÏß³ÌÔÚÖ´ÐÐÒÔ·ÃÎʹ²ÏíÊý¾Ý¡£

¶þ¡¢Í¬²½»¥³âËø

ͬ²½ËøµÄÔ­Àí£ºJavaÖÐÿ¸ö¶ÔÏó¶¼ÓÐÒ»¸öÄÚÖÃͬ²½Ëø¡£JavaÖпÉÒÔʹÓÃsynchronized¹Ø¼ü×ÖÀ´È¡µÃÒ»¸ö¶ÔÏóµÄͬ²½Ëø¡£synchronizedµÄʹÓ÷½Ê½£¬ÊÇÔÚÒ»¶Î´úÂë¿éÖУ¬¼ÓÉÏsynchronized(object){ ... }

ÀýÈ磬ÓÐÒ»¸öshow·½·¨£¬ÀïÃæÓÐsynchronizedµÄ´úÂë¶Î£º

public void show() {  
synchronized(object){
......
}
}

ÕâÆäÖеÄobject¿ÉÒÔʹÈκζÔÏ󣬱íʾµ±Ç°Ïß³ÌÈ¡µÃ¸Ã¶ÔÏóµÄËø¡£Ò»¸ö¶ÔÏóÖ»ÓÐÒ»¸öËø£¬ËùÒÔÆäËûÈκÎÏ̶߳¼²»ÄÜ·ÃÎʸöÔÏóµÄËùÓÐ

synchronized°üÀ¨µÄ´úÂë¶Î£¬Ö±µ½¸ÃÏß³ÌÊͷŵôÕâ¸ö¶ÔÏóµÄͬ²½Ëø£¨ÊÍ·ÅËøÊÇÖ¸³ÖËøÏß³ÌÍ˳öÁËsynchronizedͬ²½·½·¨»ò´úÂë¿é£©¡£

×¢Ò⣺synchronizedʹÓ÷½Ê½Óм¸¸öҪעÒâµÄµØ·½£¨»¹ÊÇÒÔÉÏÃæµÄshow·½·¨¾ÙÀý£©£º

¢Ù¡¢È¡µÃͬ²½ËøµÄ¶ÔÏóΪthis£¬¼´µ±Ç°Àà¶ÔÏó£¬ÕâÊÇʹÓõÄ×î¶àµÄÒ»ÖÖ·½Ê½

public void show() {  
synchronized(this){
......
}
}

¢Ú¡¢½«synchronized¼Óµ½·½·¨ÉÏ£¬Õâ½Ð×öͬ²½·½·¨£¬Ï൱ÓÚµÚÒ»ÖÖ·½Ê½µÄËõд

public synchronized void show() {  

}

¢Û¡¢¾²Ì¬·½·¨µÄͬ²½

public static synchronized void show() {  

}

Ï൱ÓÚ

public static void show() {  
synchronized(µ±Ç°ÀàÃû.class)
}

Ï൱ÓÚÈ¡µÃÀà¶ÔÏóµÄͬ²½Ëø£¬×¢ÒâËüºÍÈ¡µÃÒ»¸ö¶ÔÏóµÄͬ²½Ëø²»Ò»Ñù

Ã÷°×ÁËͬ²½ËøµÄÔ­ÀíºÍsynchronized¹Ø¼ü×ÖµÄʹÓã¬ÄÇô½â¾öÉÏÃæµÄȡǮÎÊÌâ¾ÍºÜ¼òµ¥ÁË£¬ÎÒÃÇÖ»Òª¶Ôrun·½·¨ÀïÃæ¼ÓÉÏsynchronized¹Ø¼ü×Ö¾ÍûÓÐÎÊÌâÁË£¬ÈçÏ£º

@Override  
public void run() {
synchronized (account) {
if (account.getMoney() > 3000) {
System.out.println(Thread.currentThread().getName() + "µÄÕË»§ÓÐ"
+ account.getMoney() + "Ôª");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
int lasetMoney = account.getMoney() - 3000;
account.setMoney(lasetMoney);
System.out.println(Thread.currentThread().getName()
+ "È¡³öÀ´ÁË3000Ôª" + Thread.currentThread().getName()
+ "µÄÕË»§»¹ÓÐ" + account.getMoney() + "Ôª");

} else {
System.out.println("Óà¶î²»×ã3000"
+ Thread.currentThread().getName() + "µÄÕË»§Ö»ÓÐ"
+ account.getMoney() + "Ôª");
}

}
}

µ±¼×Ïß³ÌÖ´ÐÐrun·½·¨µÄʱºò£¬ËüʹÓÃsynchronized (account)È¡µÃÁËaccount¶ÔÏóµÄͬ²½Ëø£¬ÄÇôֻҪËüûÊͷŵôÕâ¸öËø£¬ÄÇôµ±ÒÒÏß³ÌÖ´Ðе½run·½·¨µÄʱºò£¬Ëü¾Í²»ÄÜ»ñµÃ¼ÌÐøÖ´ÐеÄËø£¬ËùÒÔÖ»Äܵȼ×Ïß³ÌÖ´ÐÐÍ꣬ȻºóÊͷŵôËø£¬ÒÒÏ̲߳ÅÄܼÌÐøÖ´ÐС£

synchronized¹Ø¼ü×ÖʹÓÃҪעÒâÒÔϼ¸µã£º

1£©¡¢Ö»ÄÜͬ²½·½·¨ºÍ´úÂë¿é£¬¶ø²»ÄÜͬ²½±äÁ¿ºÍÀà¡£Ö»Òª±£»¤ºÃÀàÖÐÊý¾ÝµÄ°²È«·ÃÎʺÍÉèÖþͿÉÒÔÁË£¬²»ÐèÒª¶ÔÀàʹÓÃsynchronized¹Ø¼ü×Ö£¬ËùÒÔJava²»ÔÊÐíÕâô×ö¡£²¢ÇÒÏëҪͬ²½Êý¾Ý£¬Ö»ÐèÒª¶Ô³ÉÔ±±äÁ¿Ë½Óл¯£¬È»ºóͬ²½·½·¨¼´¿É£¬²»ÐèÒª¶Ô³ÉÔ±±äÁ¿Ê¹ÓÃsynchronized£¬javaÒ²½ûÖ¹Õâô×ö¡£

2£©¡¢Ã¿¸ö¶ÔÏóÖ»ÓÐÒ»¸öͬ²½Ëø£»µ±Ìᵽͬ²½Ê±£¬Ó¦¸ÃÇå³þÔÚʲôÉÏͬ²½£¿Ò²¾ÍÊÇ˵£¬ÔÚÄĸö¶ÔÏóÉÏͬ²½£¿ÉÏÃæµÄ´úÂëÖÐrun·½·¨Ê¹ÓÃsynchronized (account)´úÂë¿é£¬ÒòΪÁ½¸öÏ̷߳ÃÎʵͼÊÇͬһ¸öAccount¶ÔÏó£¬ËùÒÔÄܹ»Ëø¶¨¡£µ«ÊÇÈç¹ûÊÇÆäËûµÄÒ»¸öÎ޹صĶÔÏ󣬾ÍûÓÃÁË¡£±ÈÈç˵synchronized (new Date())´úÂë¿é£¬Ò»ÑùûÓÐЧ¹û¡£

3£©¡¢²»±ØÍ¬²½ÀàÖÐËùÓеķ½·¨£¬Àà¿ÉÒÔͬʱӵÓÐͬ²½ºÍ·Çͬ²½·½·¨¡£

4£©¡¢Èç¹ûÁ½¸öÏß³ÌÒªÖ´ÐÐÒ»¸öÀàÖеÄsynchronized·½·¨£¬²¢ÇÒÁ½¸öÏß³ÌʹÓÃÏàͬµÄʵÀýÀ´µ÷Ó÷½·¨£¬ÄÇôһ´ÎÖ»ÄÜÓÐÒ»¸öÏß³ÌÄܹ»Ö´Ðз½·¨£¬ÁíÒ»¸öÐèÒªµÈ´ý£¬Ö±µ½Ëø±»ÊÍ·Å¡£Ò²¾ÍÊÇ˵£ºÈç¹ûÒ»¸öÏß³ÌÔÚ¶ÔÏóÉÏ»ñµÃÒ»¸öËø£¬¾ÍûÓÐÈÎºÎÆäËûÏ߳̿ÉÒÔ½øÈ루¸Ã¶ÔÏóµÄ£©ÀàÖеÄÈκÎÒ»¸öͬ²½·½·¨¡£

5£©¡¢Èç¹ûÏß³ÌÓµÓÐͬ²½ºÍ·Çͬ²½·½·¨£¬Ôò·Çͬ²½·½·¨¿ÉÒÔ±»¶à¸öÏß³Ì×ÔÓÉ·ÃÎʶø²»ÊÜËøµÄÏÞÖÆ¡£

6£©¡¢Ïß³Ì˯Ãßʱ£¬ËüËù³ÖµÄÈκÎͬ²½Ëø¶¼²»»áÊÍ·Å¡£

7£©¡¢Ï߳̿ÉÒÔ»ñµÃ¶à¸öͬ²½Ëø¡£±ÈÈ磬ÔÚÒ»¸ö¶ÔÏóµÄͬ²½·½·¨ÀïÃæµ÷ÓÃÁíÍâÒ»¸ö¶ÔÏóµÄͬ²½·½·¨£¬Ôò»ñÈ¡ÁËÁ½¸ö¶ÔÏóµÄͬ²½Í¬²½Ëø¡£

8£©¡¢Í¬²½Ë𺦲¢·¢ÐÔ£¬Ó¦¸Ã¾¡¿ÉÄÜËõСͬ²½·¶Î§¡£Í¬²½²»µ«¿ÉÒÔͬ²½Õû¸ö·½·¨£¬»¹¿ÉÒÔͬ²½·½·¨ÖÐÒ»²¿·Ö´úÂë¿é¡£

9£©¡¢±àдḬ̈߳²È«µÄ´úÂë»áʹϵͳµÄ×ÜÌåЧÂʻήµÍ£¬ÒªÊÊÁ¿Ê¹ÓÃ

Ò»¸öÏß³ÌÈ¡µÃÁËͬ²½Ëø£¬ÄÇôÔÚʲôʱºò²Å»áÊͷŵôÄØ£¿

1¡¢Í¬²½·½·¨»ò´úÂë¿éÕý³£½áÊø

2¡¢Ê¹ÓÃreturn»ò breakÖÕÖ¹ÁËÖ´ÐУ¬»òÕßÅܳöÁËδ´¦ÀíµÄÒì³£¡£

3¡¢µ±Ïß³ÌÖ´ÐÐͬ²½·½·¨»ò´úÂë¿éʱ£¬³ÌÐòÖ´ÐÐÁËͬ²½Ëø¶ÔÏóµÄwait()·½·¨¡£

Èý¡¢ËÀËø

ËÀËø£º¶à¸öÏß³Ìͬʱ±»×èÈû£¬ËüÃÇÖеÄÒ»¸ö»òÕßÈ«²¿¶¼Ôڵȴýij¸ö×ÊÔ´±»ÊÍ·Å¡£ÓÉÓÚÏ̱߳»ÎÞÏÞÆÚµØ×èÈû£¬Òò´Ë³ÌÐò²»ÄÜÕý³£ÔËÐС£¼òµ¥µÄ˵¾ÍÊÇ:Ïß³ÌËÀËøÊ±£¬µÚÒ»¸öÏ̵߳ȴýµÚ¶þ¸öÏß³ÌÊÍ·Å×ÊÔ´£¬¶øÍ¬Ê±µÚ¶þ¸öÏß³ÌÓÖÔڵȴýµÚÒ»¸öÏß³ÌÊÍ·Å×ÊÔ´¡£ÕâÀï¾ÙÒ»¸öͨË×µÄÀý×Ó£ºÈçÔÚÈËÐеÀÉÏÁ½¸öÈËÓ­ÃæÏàÓö£¬ÎªÁ˸ø¶Ô·½ÈõÀ£¬Á½ÈËͬʱÏòÒ»²àÂõ³öÒ»²½£¬Ë«·½ÎÞ·¨Í¨¹ý£¬ÓÖͬʱÏòÁíÒ»²àÂõ³öÒ»²½£¬ÕâÑù»¹ÊÇÎÞ·¨Í¨¹ý¡£¼ÙÉèÕâÖÖÇé¿öÒ»Ö±³ÖÐøÏÂÈ¥£¬ÕâÑù¾Í»á·¢ÉúËÀËøÏÖÏó¡£

µ¼ÖÂËÀËøµÄ¸ùÔ´ÔÚÓÚ²»Êʵ±µØÔËÓá°synchronized¡±¹Ø¼ü´ÊÀ´¹ÜÀíÏ̶߳ÔÌØ¶¨¶ÔÏóµÄ·ÃÎÊ¡£¡°synchronized¡±¹Ø¼ü´ÊµÄ×÷ÓÃÊÇ£¬È·±£ÔÚij¸öʱ¿ÌÖ»ÓÐÒ»¸öÏ̱߳»ÔÊÐíÖ´ÐÐÌØ¶¨µÄ´úÂë¿é£¬Òò´Ë£¬±»ÔÊÐíÖ´ÐеÄÏß³ÌÊ×ÏȱØÐëÓµÓжԱäÁ¿»ò¶ÔÏóµÄÅÅËûÐÔ·ÃÎÊȨ¡£µ±Ï̷߳ÃÎʶÔÏóʱ£¬Ïß³Ì»á¸ø¶ÔÏó¼ÓËø£¬¶øÕâ¸öËøµ¼ÖÂÆäËüÒ²Ïë·ÃÎÊͬһ¶ÔÏóµÄÏ̱߳»×èÈû£¬Ö±ÖÁµÚÒ»¸öÏß³ÌÊÍ·ÅËü¼ÓÔÚ¶ÔÏóÉϵÄËø¡£

Ò»¸öËÀËøµÄÔì³ÉºÜ¼òµ¥£¬±ÈÈçÓÐÁ½¸ö¶ÔÏóA ºÍ B ¡£µÚÒ»¸öÏß³ÌËø×¡ÁËA£¬È»ºóÐÝÃß1Ã룬ÂÖµ½µÚ¶þ¸öÏß³ÌÖ´ÐУ¬µÚ¶þ¸öÏß³ÌËø×¡ÁËB£¬È»ºóÒ²ÐÝÃß1Ã룬ȻºóÓÐÂÖµ½µÚÒ»¸öÏß³ÌÖ´ÐС£µÚÒ»¸öÏß³ÌÓÖÆóÍ¼Ëø×¡B£¬¿ÉÊÇBÒѾ­±»µÚ¶þ¸öÏß³ÌËø¶¨ÁË£¬ËùÒÔµÚÒ»¸öÏ߳̽øÈë×èÈû״̬£¬ÓÖÇл»µ½µÚ¶þ¸öÏß³ÌÖ´ÐС£µÚ¶þ¸öÏß³ÌÓÖÆóÍ¼Ëø×¡A£¬¿ÉÊÇAÒѾ­±»µÚÒ»¸öÏß³ÌËø¶¨ÁË£¬ËùÒÔµÚ¶þ¸öÏß³ÌÒ²½øÈë×èÈû״̬¡£¾ÍÕâÑù£¬ËÀËøÔì³ÉÁË¡£

¾Ù¸öÀý×Ó£º

package com.tao.test;  

public class DeadLock2 {
public static void main(String[] args) {
Object object1=new Object();
Object object2=new Object();
new Thread(new T(object1,object2)).start();
new Thread(new T(object2,object1)).start();
}
}
class T implements Runnable{
private Object object1;
private Object object2;
public T(Object object1,Object object2) {
this.object1=object1;
this.object2=object2;
}
public void run() {
synchronized (object1) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object2) {
System.out.println("ÎÞ·¨Ö´Ðе½ÕâÒ»²½");
}
}
};
}

ÉÏÃæµÄ¾ÍÊǸöËÀËø¡£

µÚÒ»¸öÏß³ÌÊ×ÏÈËø×¡ÁËobject1£¬È»ºóÐÝÃß¡£½Ó×ŵڶþ¸öÏß³ÌËø×¡ÁËobject2£¬È»ºóÐÝÃß¡£ÔÚµÚÒ»¸öÏß³ÌÆóͼÔÚËø×¡object2£¬½øÈë×èÈû¡£È»ºóµÚ¶þ¸öÏß³ÌÆóͼÔÚËø×¡object1£¬½øÈë×èÈû¡£ËÀËøÁË¡£

ËÄ¡¢Ï̵߳ÄЭµ÷ÔËÐÐ

¹ØÓÚÏ̵߳ÄЭµ÷ÔËÐУ¬¾­µäµÄÀý×Ó¾ÍÊÇÉú²úÕߺÍÏû·ÑÕßµÄÎÊÌâ¡£±ÈÈçÓÐÉú²úÕß²»¶ÏµÄÉú²úÂøÍ·£¬·ÅÈëÒ»¸öÀº×ÓÀ¶øÏû·ÑÕß²»¶ÏµÄ´ÓÀº×ÓÀïÄÃÂøÍ·³Ô¡£²¢ÇÒ£¬µ±Àº×ÓÂúµÄʱºò£¬Éú²úÕß֪ͨÏû·ÑÕßÀ´³ÔÂøÍ·£¬²¢ÇÒ×Ô¼ºµÈ´ý²»ÔÚÉú²úÂøÍ·¡£µ±Àº×ÓûÂúµÄµÄʱºò£¬ÓÉÏû·ÑÕß֪ͨÉú²úÕßÉú²úÂøÍ·¡£ÕâÑù²»¶ÏµÄÑ­»·¡£

ÒªÍê³ÉÉÏÃæµÄ¹¦ÄÜ£¬¹â¿¿ÎÒÃÇÇ°ÃæµÄͬ²½µÈ֪ʶ£¬ÊDz»ÄÜÍê³ÉµÄ¡£¶øÊÇÒªÓõ½Ï̼߳äµÄЭµ÷ÔËÐС£¶¥¼¶¸¸ÀàObjectÖÐÓÐ3ÖÖ·½·¨À´¿ØÖÆÏ̵߳ÄЭµ÷ÔËÐС£

notify¡¢notifyAll¡¢wait¡£ÆäÖÐwaitÓÐ3¸öÖØÔØµÄ·½·¨¡£

ÕâÈý¸ö·½·¨±ØÐëÓÉͬ²½¼àÊÓÆ÷¶ÔÏ󣨼´Ï̻߳ñµÃµÄËø¶ÔÏó£©À´µ÷Óã¬Õâ¿É·ÖΪÁ½ÖÖÇé¿ö£º

1¡¢¶ÔÓÚʹÓÃsynchronizedÐÞÊεÄͬ²½´úÂë¿é£¬ÒòΪµ±Ç°µÄÀà¶ÔÏó£¨this£©¾ÍÊÇͬ²½¼àÊÓÆ÷£¬ËùÒÔ¿ÉÒÔÔÙͬ²½·½·¨ÖÐÖ±½Óµ÷ÓÃÕâÈý¸ö·½·¨¡£

2¡¢¶ÔÓÚʹÓÃsynchronizedÐÞÊεÄͬ²½´úÂë¿é£¬Í¬²½¼àÊÓÆ÷ÊÇsynchronizedºóÀ¨ºÅµÄ¶ÔÏó£¬ËùÒÔ±ØÐëʹÓøöÔÏóµ÷ÓÃÕâÈý¸ö·½·¨¡£

wait()£º µ¼Öµ±Ç°Ï̵߳ȴý£¬Ö±µ½ÆäËûÏ̵߳÷ÓøÃͬ²½¼àÊÓÆ÷µÄnotify()·½·¨»ònotifyAll()·½·¨À´»½ÐѸÃÏ̡߳£wait()·½·¨ÓÐÈýÖÖÐÎʽ£ºÎÞʱ¼ä²ÎÊýµÄwait(Ò»Ö±µÈ´ý£¬Ö±µ½ÆäËûÏß³Ì֪ͨ)£¬´øºÁÃë²ÎÊýµÄwaitºÍ´øºÁÃ롢΢Ãë²ÎÊýµÄwait£¨ÕâÁ½ÖÖ·½·¨¶¼ÊǵȴýÖ¸¶¨Ê±¼äºó×Ô¶¯ËÕÐÑ£©¡£µ÷ÓÃwait()·½·¨µÄµ±Ç°Ï̻߳áÊͷŶԸÃͬ²½¼àÊÓÆ÷µÄËø¶¨¡£

notify()£º »½ÐÑÔÚ´Ëͬ²½¼àÊÓÆ÷ÉϵȴýµÄµ¥¸öÏ̡߳£Èç¹ûËùÓÐÏ̶߳¼ÔÚ´Ëͬ²½¼àÊÓÆ÷Éϵȴý£¬Ôò»áÑ¡Ôñ»ÃÏëÆäÖÐÒ»¸öÏ̡߳£Ñ¡ÔñÊÇÈÎÒâÐÔ¡£Ö»Óе±Ç°Ïß³Ì·ÅÆú¶Ô¸Ãͬ²½¼àÊÓÆ÷µÄËø¶¨ºó(ʹÓÃwait()·½·¨)£¬²Å¿ÉÒÔÖ´Ðб»»½ÐÑµÄÆäËûÏ̡߳£

notifyAll()£º»½ÐÑÔÚ´Ëͬ²½¼àÊÓÆ÷ÉϵȴýµÄËùÓÐÏ̡߳£Ö»Óе±Ç°Ïß³Ì·ÅÆú¶Ô¸Ãͬ²½¼àÊÓÆ÷µÄËø¶¨ºó£¬²Å¿ÉÒÔÖ´Ðб»»½ÐѵÄÏ̡߳£

ÒòΪʹÓÃwait¡¢notifyºÍnotifyAllÈý¸ö·½·¨Ò»¶¨ÊÇÔÚͬ²½´úÂë¿éÖÐʹÓõģ¬ËùÒÔÒ»¶¨ÒªÃ÷°×ÏÂÃæ¼¸µã£º

1¡¢Èç¹ûÁ½¸öÏß³ÌÊÇÒòΪ¶¼ÒªµÃµ½Í¬Ò»¸ö¶ÔÏóµÄËø£¬¶øµ¼ÖÂÆäÖÐÒ»¸öÏ߳̽øÈë×èÈû״̬¡£ÄÇôֻÓеȻñµÃËøµÄÏß³ÌÖ´ÐÐÍê±Ï£¬»òÕßËüÖ´ÐÐÁ˸ÃËø¶ÔÏóµÄwait·½·¨£¬×èÈûµÄÏ̲߳ŻáÓлú»áµÃµ½Ëø£¬¼ÌÐøÖ´ÐÐͬ²½´úÂë¿é¡£

2¡¢Ê¹ÓÃwait·½·¨½øÈëµÈ´ý״̬µÄỊ̈߳¬»áÊͷŵôËø¡£²¢ÇÒÖ»ÓÐÆäËûÏ̵߳÷ÓÃnotify»òÕßnotifyAll·½·¨£¬²Å»á±»»½ÐÑ¡£ÒªÃ÷°×£¬Ïß³ÌÒòÎªËø×èÈûºÍµÈ´ýÊDz»Í¬µÄ£¬ÒòÎªËø½øÈë×èÈû״̬£¬»áÔÚÆäËûÏß³ÌÊÍ·ÅËøµÄʱºò£¬µÃµ½ËøÔÚÖ´ÐС£¶øµÈ´ý״̬±ØÐëÒª¿¿±ðÈË»½ÐÑ£¬²¢ÇÒ»½ÐÑÁËÒ²²»Ò»¶¨»áÁ¢¿ÌÖ´ÐУ¬ÓпÉÄÜÒòΪnotifyAll·½·¨Ê¹µÃºÜ¶àÏ̱߳»»½ÐÑ£¬¶à¸öÏ̵߳ȴýͬһ¸öËø£¬¶ø½øÈë×èÈû״̬¡£»¹¿ÉÄÜÊǵ÷ÓÃnotifyµÄÏß³ÌÒÀȻûÓÐÊͷŵôËø£¬Ö»ÓеÈËûÖ´ÐÐÍêÁË£¬ÆäËûÏ̲߳ÅÄÜÈ¥Õù¶áÕâ¸öËø¡£

¿´ÏÂÃæµÄÀý×Ó£º

package com.tao.test;  

public class ThreadA {
public static void main(String[] args) {
RunnableTest myRunnanle=new RunnableTest();
new Thread(myRunnanle).start();
synchronized (myRunnanle) {
try {
System.out.println("µÚÒ»²½");
myRunnanle.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("µÚËIJ½");
}
}
}
class RunnableTest implements Runnable {
public void run() {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
System.out.println("µÚ¶þ²½");
notify();
System.out.println("µÚÈý²½");
}
}
}

ÓÐÁ½¸öỊ̈߳¬Ö÷Ï̺߳ÍÎÒÃÇ×Ô¼ºÐ½¨µÄ×ÓÏ̡߳£Ò»²½²½µÄ·ÖÎö³ÌÐòµÄÖ´ÐУº

1¡¢ÒòΪ×ÓÏß³ÌÆô¶¯ºó£¬µ÷ÓÃÁËsleep£¬ËùÒÔÖ÷Ïß³ÌÏȽøÈëͬ²½´úÂë¿é£¬¶ø×ÓÏß³ÌÖ®ºóÒòΪûÓÐËø£¬»á½øÈë×èÈû״̬¡£

2¡¢Ö÷Ï̵߳Äͬ²½´úÂë¿éÖ´ÐУ¬´òÓ¡µÚÒ»¾ä»°£¬È»ºóµ÷ÓÃwait·½·¨£¬½øÈëµÈ´ý״̬¡£ÒòΪ½øÈëÁ˵ȴý״̬£¬ËùÒÔÊͷŵôÁËËø£¬ËùÒÔ×ÓÏ߳̿ÉÒÔ»ñµÃËø£¬¿ªÊ¼Ö´ÐС£

3¡¢×ÓÏß³ÌÖ´ÐУ¬´òÓ¡µÚ¶þ¾ä»°£¬È»ºóµ÷ÓÃnotify·½·¨£¬½«Ö÷Ï̻߳½ÐÑ¡£¿ÉÊÇ×ÓÏ̲߳¢Ã»ÓнáÊø£¬ÒÀÈ»³ÖÓÐËø£¬ËùÒÔÖ÷Ï̲߳»µÃ²»½øÈë×èÈû״̬£¬µÈ´ýÕâ¸öËø¡£

4¡¢×ÓÏ̴߳òÓ¡µÚÈý¾ä»°£¬È»ºóÏß³ÌÕý³£ÔËÐнáÊø£¬ÊͷŵôËø¡£È»ºóÖ÷Ï̵߳õ½ÁËËø£¬´Ó×èÈû½øÈëÔËÐÐ״̬£¬´òÓ¡µÚËľ仰¡£

5¡¢Íê±Ï

ÔÚ¿´Ò»¸ö¹ØÓÚÉÏÃæÌáµ½µÄÉú²úÕߺÍÏû·ÑÕßµÄÀý×Ó£º

Ê×ÏÈ£¬ÊÇÉú²úÎïÆ·µÄMode£¬ÕâÀïÒÔÂøÍ·¾ÙÀý£º

// ÂøÍ·µÄʵÀý  
class ManTou {
private int id;// ÂøÍ·µÄid

public ManTou(int id) {
this.id = id;
}
public String toString(){
return "ManTou"+id;
}
}

¹²Ïí¶ÔÏó£¬Éú²úÕßÉú²úµÄÂøÍ··ÅÈëÆäÖУ¬Ïû·ÑÕß´ÓÀïÃæÄóöÂøÍ·£¬ÕâÀïÒÔÀº×Ó¾ÙÀý£º

// Àº×ÓµÄʵÀý£¬ÓÃÀ´·ÅÂøÍ·  
class BasketBall {
private int index = 0;// ±íʾװµ½µÚ¼¸¸öÁËÂøÍ·
private ManTou[] manTous = new ManTou[6];// ¿ÉÒÔ·Å6¸öÂøÍ·

// ·Å½øÈ¥Ò»¸öÂøÍ·
public synchronized void push(ManTou manTou) {
while(index==manTous.length){
try {
System.out.println("Àº×ÓÂúÁË£¡");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"Éú²ú"+manTou.toString());
this.notify();
manTous[index] = manTou;
index++;
}

// ÄÃÒ»¸öÂøÍ·
public synchronized ManTou pop() {
while (index==0) {
try {
System.out.println("Àº×Ó¿ÕÁË£¡");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
ManTou manTou=manTous[--index];
System.out.println(Thread.currentThread().getName()+"³ÔÁË"+manTou.toString());
this.notify();
return manTou;
}
}

Éú²úÕߣº

// Éú²úÕߣ¬Éú²úÂøÍ·  
class Producer implements Runnable {
private BasketBall basketBall;

public Producer(BasketBall basketBall) {
this.basketBall = basketBall;
}

@Override
public void run() {
for (int i = 0; i < 20; i++) {
ManTou manTou = new ManTou(i);// Éú²úÂøÍ·
basketBall.push(manTou);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

// Ïû·ÑÕߣ¬ÄÃÂøÍ·³Ô  
class Consumer implements Runnable {
private BasketBall basketBall;

public Consumer(BasketBall basketBall) {
this.basketBall = basketBall;
}

@Override
public void run() {
for (int i = 0; i < 20; i++) {
ManTou manTou=basketBall.pop();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

²âÊÔ£º

public class ProducerConsumer {  
public static void main(String[] args) {
BasketBall basketBall=new BasketBall();
new Thread(new Producer(basketBall)).start();
new Thread(new Consumer(basketBall)).start();
}
}

Java¶àỊ̈߳¨ËÄ£©¡¢Ï̳߳Ø

ϵͳÆô¶¯Ò»¸öÐÂÏ̵߳ijɱ¾ÊDZȽϸߵģ¬ÒòΪËüÉæ¼°µ½Óë²Ù×÷ϵͳµÄ½»»¥¡£ÔÚÕâÖÖÇé¿öÏ£¬Ê¹ÓÃÏ̳߳ؿÉÒԺܺõÄÌṩÐÔÄÜ£¬ÓÈÆäÊǵ±³ÌÐòÖÐÐèÒª´´½¨´óÁ¿Éú´æÆÚºÜ¶ÌÔݵÄÏß³Ìʱ£¬¸üÓ¦¸Ã¿¼ÂÇʹÓÃÏ̳߳ء£

ÓëÊý¾Ý¿âÁ¬½Ó³ØÀàËÆµÄÊÇ£¬Ï̳߳ØÔÚϵͳÆô¶¯Ê±¼´´´½¨´óÁ¿¿ÕÏеÄỊ̈߳¬³ÌÐò½«Ò»¸öRunnable¶ÔÏ󴫸øÏ̳߳أ¬Ï̳߳ؾͻáÆô¶¯Ò»ÌõÏß³ÌÀ´Ö´ÐиöÔÏóµÄrun·½·¨£¬µ±run·½·¨Ö´ÐнáÊøºó£¬¸ÃÏ̲߳¢²»»áËÀÍö£¬¶øÊÇÔٴηµ»ØÏ̳߳ØÖгÉΪ¿ÕÏÐ״̬£¬µÈ´ýÖ´ÐÐÏÂÒ»¸öRunnable¶ÔÏóµÄrun·½·¨¡£

³ý´ËÖ®Í⣬ʹÓÃÏ̳߳ؿÉÒÔÓÐЧµØ¿ØÖÆÏµÍ³Öв¢·¢Ï̵߳ÄÊýÁ¿£¬µ«ÏµÍ³Öаüº¬´óÁ¿²¢·¢Ïß³Ìʱ£¬»áµ¼ÖÂϵͳÐÔÄܾçÁÒϽµ£¬ÉõÖÁµ¼ÖÂJVM±ÀÀ£¡£¶øÏ̳߳صÄ×î´óÏß³ÌÊý²ÎÊý¿ÉÒÔ¿ØÖÆÏµÍ³Öв¢·¢µÄÏ̲߳»³¬¹ý´ËÊýÄ¿¡£

ÔÚJDK1.5֮ǰ£¬¿ª·¢Õß±ØÐëÊÖ¶¯µÄʵÏÖ×Ô¼ºµÄÏ̳߳أ¬´ÓJDK1.5Ö®ºó£¬JavaÄÚ½¨Ö§³ÖÏ̳߳ء£

Óë¶àÏ̲߳¢·¢µÄËùÓÐÖ§³ÖµÄÀà¶¼ÔÚjava.lang.concurrent°üÖС£ÎÒÃÇ¿ÉÒÔʹÓÃÀïÃæµÄÀà¸ü¼ÓµÄ¿ØÖƶàÏ̵߳ÄÖ´ÐС£

Ò»¡¢ExecutorsÀà

JDK1.5ÖÐÌṩExecutors¹¤³§ÀàÀ´²úÉúÁ¬½Ó³Ø£¬¸Ã¹¤³§ÀàÖаüº¬ÈçÏµļ¸¸ö¾²Ì¬¹¤³Ì·½·¨À´´´½¨Á¬½Ó³Ø£º

1¡¢public static ExecutorService newFixedThreadPool(int nThreads)£º´´½¨Ò»¸ö¿ÉÖØÓõġ¢¾ßÓй̶¨Ïß³ÌÊýµÄÏ̳߳ء£

2¡¢public static ExecutorService newSingleThreadExecutor()£º´´½¨Ò»¸öÖ»Óе¥Ï̵߳ÄÏ̳߳أ¬ËüÏ൱ÓÚnewFixedThreadPool·½·¨ÊÇ´«ÈëµÄ²ÎÊýΪ1

3¡¢public static ExecutorService newCachedThreadPool()£º´´½¨Ò»¸ö¾ßÓлº´æ¹¦ÄܵÄÏ̳߳أ¬ÏµÍ³¸ù¾ÝÐèÒª´´½¨Ị̈߳¬ÕâЩÏ߳̽«»á±»»º´æÔÚÏ̳߳ØÖС£

4¡¢public static ScheduledExecutorService newSingleThreadScheduledExecutor£º´´½¨Ö»ÓÐÒ»ÌõÏ̵߳ÄÏ̳߳أ¬Ëû¿ÉÒÔÔÚÖ¸¶¨ÑÓ³ÙºóÖ´ÐÐÏß³ÌÈÎÎñ

5¡¢public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)£º´´½¨¾ßÓÐÖ¸¶¨Ïß³ÌÊýµÄÏ̳߳أ¬Ëü¿ÉÒÔÔÙÖ¸¶¨ÑÓ³ÙºóÖ´ÐÐÏß³ÌÈÎÎñ£¬corePoolSizeÖ¸³ØÖÐËù±£´æµÄÏß³ÌÊý£¬¼´Ê¹Ïß³ÌÊÇ¿ÕÏеÄÒ²±»±£´æÔÚÏ̳߳ØÄÚ¡£

ÉÏÃæµÄ¼¸¸ö·½·¨¶¼ÓÐÒ»¸öÖØÔØµÄ·½·¨£¬¶à´«ÈëÒ»¸öThreadFactory²ÎÊýµÄÖØÔØ·½·¨£¬Ê¹ÓõıȽÏÉÙ¡£

¶þ¡¢ExecutorServiceÀà

¿ÉÒÔ¿´µ½ÉÏÃæµÄ5¸ö·½·¨ÖУ¬Ç°Ãæ3¸ö·½·¨µÄ·µ»ØÖµ¶¼ÊÇÒ»¸öExecutorService¶ÔÏ󡣸ÃExecutorService¶ÔÏó¾Í´ú±í×ÅÒ»¸ö¾¡¿ìÖ´ÐÐÏ̵߳ÄÏ̳߳أ¨Ö»ÒªÏ̳߳ØÖÐÓпÕÏÐÏß³ÌÁ¢¼´Ö´ÐÐÏß³ÌÈÎÎñ£©£¬³ÌÐòÖ»Òª½«Ò»¸öRunnable¶ÔÏó»òCallable¶ÔÏóÌá½»¸ø¸ÃÏ̳߳ؼ´¿É£¬¸ÃÏ߳̾ͻᾡ¿ìµÄÖ´ÐиÃÈÎÎñ¡£

ExecutorServiceÓм¸¸öÖØÒªµÄ·½·¨£º

¸üÏêϸµÄ²Î¿¼JDK APIÎĵµ¡£

submit·½·¨ÊÇ¶Ô Executor½Ó¿Úexecute·½·¨µÄ¸üºÃµÄ·â×°£¬½¨ÒéʹÓÃsubmit·½·¨¡£

Èý¡¢ScheduleExecutorServiceÀà

ÔÚÉÏÃæµÄ5¸ö·½·¨ÖУ¬ºóÃæ2¸ö·½·¨µÄ·µ»ØÖµ¶¼ÊÇÒ»¸öScheduleExecutorService¶ÔÏó¡£ScheduleExecutorService´ú±í¿ÉÔÚÖ¸¶¨ÑÓ³Ù»òÖÜÆÚÐÔÖ´ÐÐÏß³ÌÈÎÎñµÄÏ̳߳ء£

ScheduleExecutorServiceÀàÊÇExecutorServiceÀàµÄ×ÓÀà¡£ËùÒÔ£¬ËüÀïÃæÒ²ÓÐÖ±½ÓÌá½»ÈÎÎñµÄsubmit·½·¨£¬²¢ÇÒÐÂÔöÁËһЩÑÓ³ÙÈÎÎñ´¦ÀíµÄ·½·¨£º

ÏÂÃæ¿´¿´Ï̳߳صļòµ¥Ê¹Óãº

1¡¢¹Ì¶¨´óСµÄÏ̳߳أº

ackage com.tao.test;  

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class PoolTest {
public static void main(String[] args) {
ExecutorService pool=Executors.newFixedThreadPool(5);//´´½¨Ò»¸ö¹Ì¶¨´óСΪ5µÄÏ̳߳Ø
for(int i=0;i<7;i++){
pool.submit(new MyThread());
}
pool.shutdown();
}
}
class MyThread extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"ÕýÔÚÖ´ÐС£¡£¡£");
}
}

Êä³ö½á¹û£º

pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£  
pool-1-thread-3ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-2ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-4ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-4ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-5ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£

¿ÉÒÔ¿´µ½ËäÈ»ÎÒÃÇÄØ´´½¨ÁË7¸öMyThreadÏ̶߳ÔÏ󣬵«ÊÇÓÉÓÚÊÜÏ̳߳صĴóСÏÞÖÆ£¬Ö»ÊÇ¿ªÆôÁË5¸öỊ̈߳¬ÕâÑù¾Í¼õÉÙÁ˲¢·¢Ï̵߳ÄÊýÁ¿¡£

2¡¢µ¥ÈÎÎñÏ̳߳أº

public class PoolTest {  
public static void main(String[] args) {
ExecutorService pool=Executors.newSingleThreadExecutor();//´´½¨Ò»¸öµ¥Ï̳߳Ø
for(int i=0;i<7;i++){
pool.submit(new MyThread());
}
pool.shutdown();
}
}

Êä³ö½á¹û£º

pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£  
pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£

¿ÉÒÔ¿´µ½£¬Ï̳߳ØÖ»¿ªÆôÁËÒ»¸öÏ̡߳£

3¡¢´´½¨¿É±ä³ß´çµÄÏ̳߳Ø

public class PoolTest {  
public static void main(String[] args) {
ExecutorService pool=Executors.newCachedThreadPool();
for(int i=0;i<5;i++){
pool.submit(new MyThread());
}
pool.shutdown();
}
}

¿´Êä³ö½á¹û£º

pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£  
pool-1-thread-3ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-2ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-4ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-5ÕýÔÚÖ´ÐС£¡£¡£

¿ÉÒÔ¿´µ½£¬ÎÒÃÇûÓÐÏÞÖÆÏ̳߳صĴóС£¬µ«ÊÇËü»á¸ù¾ÝÐèÇó¶ø´´½¨Ï̡߳£

4¡¢ÑÓ³ÙÏ̳߳Ø

public class PoolTest {  
public static void main(String[] args) {
ScheduledExecutorService pool=Executors.newScheduledThreadPool(6);
for(int i=0;i<4;i++){
pool.submit(new MyThread());
}

pool.schedule(new MyThread(), 1000, TimeUnit.MILLISECONDS);
pool.schedule(new MyThread(), 1000, TimeUnit.MILLISECONDS);
pool.shutdown();
}
}

Êä³ö½á¹û£º

pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£  
pool-1-thread-3ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-2ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-4ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-6ÕýÔÚÖ´ÐС£¡£¡£
pool-1-thread-1ÕýÔÚÖ´ÐС£¡£¡£

¿ÉÒÔÃ÷ÏÔ¿´µ½£¬×îºóÁ½¸öÏ̲߳»ÊÇÁ¢¼´Ö´ÐУ¬¶øÊÇÑÓ³ÙÁË1ÃëÔÚÖ´Ðеġ£

5¡¢µ¥ÈÎÎñÑÓ³ÙÏ̳߳Ø

public class PoolTest {  
public static void main(String[] args) {
ScheduledExecutorService pool=Executors.newSingleThreadScheduledExecutor();
for(int i=0;i<4;i++){
pool.submit(new MyThread());
}

pool.schedule(new MyThread(), 1000, TimeUnit.MILLISECONDS);
pool.schedule(new MyThread(), 1000, TimeUnit.MILLISECONDS);
pool.shutdown();
}
}

ÉÏÃæÎÒÃÇʹÓõÄÊÇJDK°ïÎÒ·â×°ºÃµÄÏ̳߳أ¬ÎÒÃÇÒ²¿ÉÒÔ×Ô¼º¶¨ÒåÏ̳߳أ¬²é¿´Ô´Â룬ÎÒÃÇ·¢ÏÖ£¬ExcutorsÀïÃæµÄ»ñµÃÏ̵߳ľ²Ì¬·½·¨£¬ÄÚ²¿¶¼Êǵ÷ÓÃThreadPoolExecutorµÄ¹¹Ôì·½·¨¡£±ÈÈ磺

public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {  
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory);
}

¿ÉÒÔ¿´µ½£¬ËüÊÇͨ¹ýµ÷ÓÃThreadPoolExecutorµÄ¹¹Ôì·½·¨À´·µ»ØÒ»¸öÏ̳߳صġ£ËùÒÔ£¬ÎÒÃÇÒ²¿ÉÒÔ×Ô¼ºÊÖ¶¯µÄµ÷ÓÃThreadPoolExecutorµÄ¸÷ÖÖ¹¹Ôì·½·¨£¬À´¶¨Òå×Ô¼ºµÄÏ̳߳عæÔò£¬²»¹ýÒ»°ãÇé¿öÏ£¬Ê¹ÓÃ×Ô´øµÄÏ̳߳ؾ͹»ÁË£¬²»ÐèÒª×Ô¼ºÀ´ÊµÏÖ¡£

Java¶àỊ̈߳¨Î壩¡¢¶àÏß³ÌÆäËû֪ʶ¼òÒª½éÉÜ

Ò»¡¢Ïß³Ì×é

/** 
* A thread group represents a set of threads. In addition, a thread
* group can also include other thread groups. The thread groups form
* a tree in which every thread group except the initial thread group
* has a parent.
* <p>
* A thread is allowed to access information about its own thread
* group, but not to access information about its thread group's
* parent thread group or any other thread groups.
*
* @author unascribed
* @version 1.66, 03/13/08
* @since JDK1.0
*/

Ò»¸öÏß³Ì×é´ú±íÁËһϵÁеÄÏ̡߳£²¢ÇÒ£¬Ò»¸öÏß³Ì×é¿ÉÒÔ°üÀ¨ÆäËûµÄÏß³Ì×é¡£³ýÁ˳õʼÏß³Ì×éÍ⣬ÿ¸öÏß³Ì×é¶¼ÓÐÒ»¸ö¸¸Ïß³Ì×飬ÀàËÆÓÚÊ÷µÄ½á¹¹¡£

Ò»¸öÏ߳̿ÉÒÔ·ÃÎÊËüËùÔÚÏß³Ì×éµÄÐÅÏ¢£¬ ²»¿ÉÒÔ·ÃÎÊËü¸¸Ïß³Ì×éºÍÆäËûÏß³Ì×éµÄÐÅÏ¢¡£

´ÓÕâ¶Î»°ÖпÉÒÔ´ó¸ÅÃ÷°×Ïß³Ì×éµÄ¸ÅÄËùÓеÄÏ̺߳ÍÏß³Ì×é¹¹³ÉÒ»¸öÊ÷µÄ½á¹¹£¬ÈçÏ£º

²é¿´ThreadµÄAPI£¬¿ÉÒÔ¿´µ½£¬´´½¨Ò»¸öÏ߳̿ÉÒÔÖ¸¶¨ËüµÄÏß³Ì×éºÍ²»Ö¸¶¨Ïß³Ì×é¡£Èç¹ûÖ¸¶¨ÆäËùÊôµÄÏß³Ì×飬ÄÇô¸ÃÏß³Ì×éÊÇ´´½¨ËüµÄÏß³ÌËùÊôÏß³Ì×éµÄ×ÓÏß³Ì×é¡£Èç¹û²»Ö¸¶¨Ïß³Ì×飬ÔòÊôÓÚĬÈÏÇé¿ö£¬¸ÃÏ̺߳ʹ´½¨ËüµÄÏß³ÌÔÚͬһ¸öÏß³Ì×é¡£

ÒÔÉÏÃæµÄͼ¾Ù¸ö¼òµ¥µÄÀý×Ó£º

Èç¹ûmainÏ̴߳´½¨ÁËThread1Ị̈߳¬Ã»ÓÐÖ¸¶¨Thread1ËùÔÚµÄÏß³Ì×飬ÄÇôThread1¾ÍĬÈϺÍmainÏß³ÌÊôÓÚͬһ¸öÏß³Ì×飬¼´ÏµÍ³Ïß³Ì×é¡£

Èç¹ûmainÏ̴߳´½¨ÁËThread3Ị̈߳¬Ã»Ö¸¶¨Thread3ËùÔÚµÄÏß³Ì×éΪÏß³Ì×é1£¬ÄÇôÏß³Ì×é1¾ÍÊôÓÚϵͳÏß³Ì×飬ºÍmainÏß³ÌÔÚÊ÷½á¹¹ÖÐÆ½¼¶¡£

Ò»µ©Ä³¸öÏ̼߳ÓÈëÁËÖ¸¶¨Ïß³Ì×éÖ®ºó£¬¸ÃÏ߳̽«Ò»Ö±ÊôÓÚ¸ÃÏß³Ì×飬ֱµ½¸ÃÏß³ÌËÀÍö£¬Ïß³ÌÔËÐÐÖÐ;²»ÄܸıäËüËùÊôµÄÏß³Ì×é¡£ÒòΪָ¶¨Ïß³ÌËùÔÚÏß³Ì×éÊÇÔÚ´´½¨Ï̵߳ÄÊÓºõÍê³ÉµÄ£¬ËùÒÔÖ®ºó²»ÄÜÔÙÐÞ¸ÄËüËùÔÚµÄÏß³Ì×é¡£

ÏÂÃæÊÇThreadGroupµÄ·½·¨ÕªÒª

¶þ¡¢Ïß³Ì×éÓëδ´¦ÀíµÄÒì³£

´ÓJDK1.5¿ªÊ¼£¬Java¼ÓÇ¿ÁËÏ̵߳ÄÒì³£´¦Àí£¬Èç¹ûÏß³ÌÖ´Ðйý³ÌÖÐÅ׳öÁËÒ»¸öδ´¦ÀíµÄÒì³££¬JVMÔÚ½áÊø¸ÃÏß³Ì֮ǰ»á×Ô¶¯²éÕÒÊÇ·ñÓжÔÓ¦µÄThread.UncaughtExceptionHandler¶ÔÏó£¬Èç¹ûÕÒµ½¸Ã´¦ÀíÆ÷¶ÔÏ󣬽«»áµ÷ÓøöÔÏóµÄuncaughtException(Thread t,Throwable e)·½·¨À´´¦Àí¸ÃÒì³£¡£

Thread.UncaughtExceptionHandlerÊÇThreadÀàµÄÒ»¸öÄÚ²¿¹«¹²¾²Ì¬½Ó¿Ú£¬¸Ã½Ó¿ÚÄÚÖ»ÓÐÒ»¸ö·½·¨£º

void uncaughtException(Thread t,Throwable t)£¬¸Ã·½·¨ÖеÄt´ú±í³öÏÖÒì³£µÄỊ̈߳¬¶øe´ú±í¸ÃÏß³ÌÅ׳öµÄÒì³£¡£

ThreadÀàÌṩÁËÁ½¸ö·½·¨À´ÉèÖÃÒì³£´¦ÀíÆ÷£º

public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh)

Ïß³ÌÀàµÄËùÓÐÏß³ÌʵÀýÉèÖÃĬÈϵÄÒì³£´¦ÀíÆ÷

public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh)

Ϊָ¶¨Ï̵߳ÄʵÀýÉèÖÃÒì³£´¦ÀíÆ÷

ThreadGroupÀàʵÏÖÁËThread.UncaughtExceptionHandler½Ó¿Ú£¬ËùÒÔÿ¸öÏß³ÌËùÊôµÄÏß³Ì×齫»á×÷ΪĬÈϵÄÒì³£´¦ÀíÆ÷¡£µ±Ò»¸öÏß³ÌÅ׳öδ´¦ÀíµÄÒ쳣ʱ£¬JVM»áÊ×ÏȲéÕÒ¸ÃÒì³£¶ÔÓ¦µÄÒì³£´¦ÀíÆ÷(setUncaughtExceptionHandler·½·¨ÉèÖõÄÒì³£´¦ÀíÆ÷)£¬Èç¹ûÕÒµ½¸ÃÒì³£´¦ÀíÆ÷£¬½«µ÷ÓøÃÒì³£´¦ÀíÆ÷´¦Àí¸ÃÒì³££¬·ñÔò£¬JVM½«»áµ÷ÓøÃÏß³ÌËùÊôµÄÏß³Ì×é¶ÔÏóµÄuncaughtException·½·¨À´´¦Àí¸ÃÒì³££¬Ïß³Ì×é´¦ÀíÒì³£µÄÁ÷³ÌÈçÏ£º

1£©¡¢Èç¹û¸ÃÏß³Ì×éÓи¸Ïß³Ì×飬Ôòµ÷Óø¸Ïß³Ì×éµÄuncaughtException·½·¨À´´¦Àí¸ÃÒì³£

2£©¡¢·ñÔò£¬Èç¹û¸ÃÏß³ÌʵÀýËùÊôµÄÏß³ÌÀàÓÐĬÈϵÄÒì³£´¦ÀíÆ÷£¨ÓÉsetDefaultUncaughtExceptionHandler·½·¨ÉèÖõÄÒì³£´¦ÀíÆ÷£©£¬ÄÇô¾Íµ÷ÓøÃÒì³£´¦ÀíÆ÷À´´¦Àí¸ÃÒì³£

3£©¡¢·ñÔò£¬½«Òì³£µ÷ÊÔÕ»µÄÐÅÏ¢´òÓ¡µ½System.err´íÎóÊä³öÁ÷£¬²¢½áÊø¸ÃÏ̡߳£

¿´ÏÂÃæµÄÀý×Ó£º

class MyHandler implements Thread.UncaughtExceptionHandler{  
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("³öÏÖÁËÒì³£");
e.printStackTrace();
}
}
public class Test{
public static void main(String[] args) {
Thread.currentThread().setUncaughtExceptionHandler(new MyHandler());
int a=1/0;
}
}

ÔÚÖ÷Ïß³ÌÖÐÉèÖÃÁËÒì³£´¦ÀíÆ÷£¬×îºó²¶»ñÁËÒì³£¡£

   
3090 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

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¼°ÆäÇ°ÑØ¼¼Êõ