ºìÁªLinuxÃÅ»§
Linux°ïÖú

¹ØÓÚ½â¾ö Java ±à³ÌÓïÑÔÏß³ÌÎÊÌâµÄ½¨Ò飨3£©

·¢²¼Ê±¼ä:2006-05-03 19:10:46À´Ô´:ºìÁª×÷Õß:ÌìɽÀÏͯ
ÐÞ¸Ä Thread Àà

ͬʱ֧³ÖÇÀռʽºÍЭ×÷ʽÏ̵߳ÄÄÜÁ¦ÔÚijЩ·þÎñÆ÷Ó¦ÓóÌÐòÖÐÊÇ»ù±¾ÒªÇó£¬ÓÈÆäÊÇÔÚÏëʹϵͳ´ïµ½×î¸ßÐÔÄܵÄÇé¿öÏ¡£ÎÒÈÏΪ
Java ±à³ÌÓïÑÔÔÚ¼ò»¯Ïß³ÌÄ£ÐÍÉÏ×ßµÃÌ«Ô¶ÁË£¬²¢ÇÒ Java ±à³ÌÓïÑÔÓ¦Ö§³Ö
Posix/Solaris µÄ¡°ÂÌÉ«(green)Ï̡߳±ºÍ¡°Çá±ã(lightweight)½ø³Ì¡±¸ÅÄÔÚ¡°£¨Taming Java Threads¡±µÚÒ»ÕÂÖÐÌÖÂÛ£©¡£
Õâ¾ÍÊÇ˵£¬ÓÐЩ Java ÐéÄâ»úµÄʵÏÖ£¨ÀýÈçÔÚ NT É쵀 Java ÐéÄâ»ú£©Ó¦ÔÚÆäÄÚ²¿·ÂÕæЭ×÷ʽ½ø³Ì£¬ÆäËü
Java ÐéÄâ»úÓ¦·ÂÕæÇÀռʽÏ̡߳£¶øÇÒÏò Java ÐéÄâ»ú¼ÓÈëÕâЩÀ©Õ¹ÊǺÜÈÝÒ׵ġ£



Ò»¸ö Java µÄ Thread ӦʼÖÕÊÇÇÀռʽµÄ¡£Õâ¾ÍÊÇ˵£¬Ò»¸ö Java ±à³ÌÓïÑÔµÄÏß³ÌÓ¦Ïñ Solaris
µÄÇá±ã½ø³ÌÒ»Ñù¹¤×÷¡£ Runnable ½Ó¿Ú¿ÉÒÔÓÃÓÚ¶¨ÒåÒ»¸ö Solaris ʽµÄ¡°ÂÌÉ«Ï̡߳±£¬´ËÏ̱߳ØÐèÄÜ°Ñ¿ØÖÆȨת¸øÔËÐÐ
ÔÚÏàͬÇá±ã½ø³ÌÖеÄÆäËüÂÌÉ«Ï̡߳£




ÀýÈ磬ĿǰµÄÓï·¨£º




class My_thread implements Runnable
{ public void run(){ /*...*/ }
}

new Thread( new My_thread );





ÄÜÓÐЧµØΪ Runnable ¶ÔÏó²úÉúÒ»¸öÂÌÉ«Ị̈߳¬²¢°ÑËü°ó¶¨µ½ÓÉ
Thread ¶ÔÏó´ú±íµÄÇá±ã½ø³ÌÖС£ÕâÖÖʵÏÖ¶ÔÓÚÏÖÓдúÂëÊÇ͸Ã÷µÄ£¬ÒòΪËüµÄÓÐЧÐÔºÍÏÖÓеÄÍêÈ«Ò»Ñù¡£


°Ñ Runnable ¶ÔÏóÏë³ÉΪÂÌÉ«Ị̈߳¬Ê¹ÓÃÕâÖÖ·½·¨£¬Ö»ÐèÏò
Thread µÄ¹¹Ô캯Êý´«µÝ¼¸¸ö Runnable¶ÔÏ󣬾ͿÉÒÔÀ©Õ¹
Java ±à³ÌÓïÑÔµÄÏÖÓÐÓï·¨£¬ÒÔÖ§³ÖÔÚÒ»¸öµ¥Ò»Çá±ãÏß³ÌÓжà¸öÂÌÉ«Ï̡߳££¨ÂÌÉ«Ïß³ÌÖ®¼ä¿ÉÒÔÏ໥Э×÷£¬µ«ÊÇËüÃǿɱ»ÔËÐÐÔÚÆäËüÇá±ã½ø³Ì
(Thread ¶ÔÏó) ÉϵÄÂÌÉ«½ø³Ì(Runnable ¶ÔÏó) ÇÀÕ¼¡££©¡£ÀýÈ磬ÏÂÃæµÄ´úÂë»áΪÿ¸ö
runnable ¶ÔÏó´´½¨Ò»¸öÂÌÉ«Ị̈߳¬ÕâЩÂÌÉ«Ï̻߳ṲÏíÓÉ Thread ¶ÔÏó´ú±íµÄÇá±ã½ø³Ì¡£


new Thread( new My_runnable_object(), new My_other_runnable_object() );





ÏÖÓеĸ²¸Ç(override) Thread ¶ÔÏó²¢ÊµÏÖ run() µÄÏ°¹ß¼ÌÐøÓÐЧ£¬µ«ÊÇËüÓ¦Ó³Éäµ½Ò»¸ö±»°ó¶¨µ½Ò»Çá±ã½ø³ÌµÄÂÌÉ«Ï̡߳£(ÔÚ
Thread() ÀàÖеÄȱʡ run() ·½·¨»áÔÚÄÚ²¿ÓÐЧµØ´´½¨µÚ¶þ¸ö Runnable ¶ÔÏó¡£)

Ï̼߳äµÄЭ×÷

Ó¦ÔÚÓïÑÔÖмÓÈë¸ü¶àµÄ¹¦ÄÜÒÔÖ§³ÖÏ̼߳äµÄÏ໥ͨÐÅ¡£Ä¿Ç°£¬PipedInputStream
ºÍ PipedOutputStream Àà¿ÉÓÃÓÚÕâ¸öÄ¿µÄ¡£µ«ÊǶÔÓÚ´ó¶àÊýÓ¦ÓóÌÐò£¬ËüÃÇÌ«ÈõÁË¡£ÎÒ½¨ÒéÏò
Thread Àà¼ÓÈëÏÂÁк¯Êý£º


Ôö¼ÓÒ»¸ö wait_for_start() ·½·¨£¬Ëüͨ³£´¦ÓÚ×èÈû״̬£¬Ö±µ½Ò»¸öÏ̵߳Ä
run() ·½·¨Æô¶¯¡£(Èç¹ûµÈ´ýµÄÏß³ÌÔÚµ÷Óà run ֮ǰ±»ÊÍ·Å£¬ÕâûÓÐʲôÎÊÌ⣩¡£ÓÃÕâÖÖ·½·¨£¬Ò»¸öÏ߳̿ÉÒÔ´´½¨Ò»¸ö»ò¶à¸ö¸¨ÖúỊ̈߳¬²¢±£Ö¤ÔÚ´´½¨Ï̼߳ÌÐøÖ´ÐвÙ×÷֮ǰ£¬ÕâЩ¸¨ÖúÏ̻߳ᴦÓÚÔËÐÐ״̬¡£


£¨Ïò Object ÀࣩÔö¼Ó $send (Object o) ºÍ Object=$receive()
·½·¨£¬ËüÃǽ«Ê¹ÓÃÒ»¸öÄÚ²¿×è¶Ï¶ÓÁÐÔÚÏß³ÌÖ®¼ä´«ËͶÔÏó¡£×è¶Ï¶ÓÁÐÓ¦×÷ΪµÚÒ»¸ö
$send() µ÷Óõĸ±²úÆ·±»×Ô¶¯´´½¨¡£ $send() µ÷Óûá°Ñ¶ÔÏó¼ÓÈë¶ÓÁС£
$receive() µ÷ÓÃͨ³£´¦ÓÚ×èÈû״̬£¬Ö±µ½ÓÐÒ»¸ö¶ÔÏó±»¼ÓÈë¶ÓÁУ¬È»ºóËü·µ»Ø´Ë¶ÔÏó¡£ÕâÖÖ·½·¨ÖеıäÁ¿Ó¦Ö§³ÖÉ趨Èë¶ÓºÍ³ö¶ÓµÄ²Ù×÷³¬Ê±ÄÜÁ¦£º
$send (Object o, long timeout)
ºÍ $receive (long timeout)¡£



¶ÔÓÚ¶ÁдËøµÄÄÚ²¿Ö§³Ö

¶ÁдËøµÄ¸ÅÄîÓ¦ÄÚÖõ½ Java ±à³ÌÓïÑÔÖС£¶ÁдÆ÷ËøÔÚ¡°Taming Java Threads¡±£¨ºÍÆäËüµØ·½£©ÖÐÓÐÏêϸÌÖÂÛ£¬¸ÅÀ¨µØ˵£ºÒ»¸ö¶ÁдËøÖ§³Ö¶à¸öÏß³Ìͬʱ·ÃÎÊÒ»¸ö¶ÔÏ󣬵«ÊÇÔÚͬһʱ¿ÌÖ»ÓÐÒ»¸öÏ߳̿ÉÒÔÐ޸Ĵ˶ÔÏ󣬲¢ÇÒÔÚ·ÃÎʽøÐÐʱ²»ÄÜÐ޸ġ£¶ÁдËøµÄÓï·¨¿ÉÒÔ½èÓà synchronized ¹Ø¼ü×Ö£º

static Object global_resource;

//...

public void a()
{
$reading( global_resource )
{ // While in this block, other threads requesting read
// access to global_resource will get it, but threads
// requesting write access will block.
}
}

public void b()
{
$writing( global_resource )
{ // Blocks until all ongoing read or write operations on
// global_resource are complete. No read or write
// operation or global_resource can be initiated while
// within this block.
}
}

public $reading void c()
{ // just like $reading(this)...
}

public $writing void d()
{ // just like $writing(this)...
}





¶ÔÓÚÒ»¸ö¶ÔÏó£¬Ó¦¸ÃÖ»ÓÐÔÚ $writing ¿éÖÐûÓÐÏß³Ìʱ£¬²ÅÖ§³Ö¶à¸öÏ߳̽øÈë
$reading ¿é¡£ÔÚ½øÐжÁ²Ù×÷ʱ£¬Ò»¸öÊÔͼ½øÈë $writing
¿éµÄÏ̻߳ᱻ×è¶Ï£¬Ö±µ½¶ÁÏß³ÌÍ˳ö $reading
¿é¡£ µ±ÓÐÆäËüÏ̴߳¦ÓÚ $writing ¿éʱ£¬ÊÔͼ½øÈë $reading
»ò $writing ¿éµÄÏ̻߳ᱻ×è¶Ï£¬Ö±µ½´ËдÏß³ÌÍ˳ö $writing
¿é¡£



Èç¹û¶ÁºÍдÏ̶߳¼Ôڵȴý£¬È±Ê¡Çé¿öÏ£¬¶ÁÏ̻߳áÊ×ÏȽøÐС£µ«ÊÇ£¬¿ÉÒÔʹÓÃ
$writer_priority ÊôÐÔÐÞ¸ÄÀàµÄ¶¨ÒåÀ´¸Ä±äÕâÖÖȱʡ·½Ê½¡£È磺



$write_priority class IO
{
$writing write( byte[] data )
{ //...
}

$reading byte[] read( )
{ //...
}
}


·ÃÎʲ¿·Ö´´½¨µÄ¶ÔÏóÓ¦ÊÇ·Ç·¨µÄ

µ±Ç°Çé¿öÏ£¬JLS ÔÊÐí·ÃÎʲ¿·Ö´´½¨µÄ¶ÔÏó¡£ÀýÈ磬ÔÚÒ»¸ö¹¹Ô캯ÊýÖд´½¨µÄÏ߳̿ÉÒÔ·ÃÎÊÕý±»´´½¨µÄ¶ÔÏ󣬼Èʹ´Ë¶ÔÏóûÓÐÍêÈ«±»´´½¨¡£ÏÂÃæ´úÂëµÄ½á¹ûÎÞ·¨È·¶¨£º


class Broken
{ private long x;

Broken()
{ new Thread()
{ public void run()
{ x = -1;
}
}.start();

x = 0;
}
}




ÉèÖà x Ϊ -1 µÄÏ߳̿ÉÒÔºÍÉèÖà x Ϊ 0 µÄÏß³Ìͬʱ½øÐС£ËùÒÔ£¬´Ëʱ x µÄÖµÎÞ·¨Ô¤²â¡£


¶Ô´ËÎÊÌâµÄÒ»¸ö½â¾ö·½·¨ÊÇ£¬ÔÚ¹¹Ô캯ÊýûÓзµ»Ø֮ǰ£¬¶ÔÓÚÔڴ˹¹Ô캯ÊýÖд´½¨µÄỊ̈߳¬¼ÈʹËüµÄÓÅÏȼ¶±Èµ÷ÓÃ
new µÄÏ̸߳ߣ¬Ò²Òª½ûÖ¹ÔËÐÐËüµÄ run() ·½·¨¡£




Õâ¾ÍÊÇ˵£¬ÔÚ¹¹Ô캯Êý·µ»Ø֮ǰ£¬ start()
ÇëÇó±ØÐë±»ÍƳ١£

ÁíÍ⣬Java ±à³ÌÓïÑÔÓ¦¿ÉÔÊÐí¹¹Ô캯ÊýµÄͬ²½¡£»»¾ä»°Ëµ£¬ÏÂÃæµÄ´úÂ루ÔÚµ±Ç°Çé¿öÏÂÊÇ·Ç·¨µÄ£©»áÏóÔ¤ÆÚµÄÄÇÑù¹¤×÷£º

class Illegal
{ private long x;

synchronized Broken()
{ new Thread()
{ public void run()
{ synchronized( Illegal.this )
{
x = -1;
}
}
}.start();

x = 0;
}
}






ÎÒÈÏΪµÚÒ»ÖÖ·½·¨±ÈµÚ¶þÖÖ¸ü¼ò½à£¬µ«ÊµÏÖÆðÀ´¸üΪÀ§ÄÑ¡£


volatile
¹Ø¼ü×ÖÓ¦ÏóÔ¤ÆÚµÄÄÇÑù¹¤×÷

JLS ÒªÇó±£Áô¶ÔÓÚ volatile ²Ù×÷µÄÇëÇó¡£´ó¶àÊý Java ÐéÄâ»ú¶¼¼òµ¥µØºöÂÔÁËÕⲿ·ÖÄÚÈÝ£¬ÕâÊDz»Ó¦¸ÃµÄ¡£ÔڶദÀíÆ÷µÄÇé¿öÏ£¬Ðí¶àÖ÷»ú¶¼³öÏÖÁËÕâÖÖÎÊÌ⣬µ«ÊÇËü±¾Ó¦ÓÉ
JLS ¼ÓÒÔ½â¾öµÄ¡£Èç¹ûÄú¶ÔÕâ·½Ãæ¸ÐÐËȤ£¬ÂíÀïÀ¼´óѧµÄ Bill Pugh
ÕýÔÚÖÂÁ¦ÓÚÕâÏ×÷£¨Çë²ÎÔIJο¼×ÊÁÏ£©¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ