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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Java¶àÏß³Ìѧϰ±Ê¼Ç£¨È«£©
 
×÷ÕߣºÐ¡Ðì À´Ô´£ºÐÂÀË΢²© ·¢²¼ÓÚ 2015-8-27
  2094  次浏览      27
 

Ò»£®Ï̵߳Ĵ´½¨ºÍÆô¶¯

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¡£

   
2094 ´Îä¯ÀÀ       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¼°ÆäÇ°ÑØ¼¼Êõ