µ±¶à¸öÏß³ÌÐèÒªÐ×÷À´Íê³ÉÒ»¼þÊÂÇéµÄʱºò£¬ÈçºÎÈ¥µÈ´ýÆäËûÏß³ÌÖ´ÐУ¬ÓÖÈçºÎµ±Ïß³ÌÖ´ÐÐÍêȥ֪ͨÆäËûÏ߳̽áÊøµÈ´ý¡£
½ø³Ì¿ÉÒÔ¶ÀÁ¢ÔËÐУ¬ËüÊÇϵͳ½øÐÐ×ÊÔ´·ÖÅäºÍµ÷¶ÈµÄ¶ÀÁ¢µ¥Î»¡£
Ïß³ÌÊǽø³ÌµÄÒ»¸öʵÌ壬ÊÇCPUµ÷¶ÈºÍ·ÖÅɵĻù±¾µ¥Î»£¬±È½ø³Ì¸üСµÄ¶ÀÁ¢µ¥Î»£¬Ëü»ù±¾Éϲ»ÓµÓÐϵͳ×ÊÔ´¡£
ËûÃÇÖ®¼äµÄÁªÏµ£º
Ò»¸öÏß³ÌÊôÓÚÒ»¸ö½ø³Ì£¬¶øÒ»¸ö½ø³ÌÓжà¸öỊ̈߳¬¶à¸öÏ̹߳²Ïí¸Ã½ø³ÌµÄËùÓÐ×ÊÔ´¡£
Çø±ð£º
1.µ÷¶È£ºÏß³Ì×÷ΪCPUµ÷¶ÈºÍ·ÖÅɵĻù±¾µ¥Î»£¬½ø³ÌÓµÓÐϵͳ×ÊÔ´µÄ¶ÀÁ¢µ¥Î»¡£
2.²¢·¢ÐÔ£º½ø³ÌÖ®¼ä²¢·¢ÔËÐУ¬Í¬Ò»¸ö½ø³ÌµÄ¶à¸öÏß³ÌÒ²Äܲ¢·¢Ö´ÐС£
3.ÓµÓÐ×ÊÔ´£¬½ø³ÌÊÇÓµÓÐϵͳ×ÊÔ´µÄ»ù±¾µ¥Î»£¬Ï̲߳»ÓµÓÐ×ÊÔ´£¬µ«ÄÜ·ÃÎʽø³ÌµÄ×ÊÔ´¡£
1.join
2.¹²Ïí±äÁ¿(volatile¡¢AtomicInteger)
3.notify/wait
4.lock/condition
5.¹ÜµÀ
Ê×ÏÈ£¬¿ªÆôÁ½¸öỊ̈߳¬·Ö±ð´òÓ¡123£¬Ïß³ÌAºÍÏß³ÌB»á²»°´Ì×·´òÓ¡¡£
Èç¹û±ØÐëÒªÏß³ÌAÔÚÏß³ÌB֮ǰ´òÓ¡123ÄØ£¿
ÐèҪʹÓÃthread1.join();//ÎÒ»áµÈ´ýÏß³Ì1Ö´ÐÐÍê³ÉºóÔÙ½øÐÐÖ´ÐÐ
ʵ¼ÊÉÏjoin·½·¨ÄÚ²¿ÊÇͨ¹ýwaitʵÏֵġ£
ÉÏÒ»¶ÎjdkÔ´Âë
public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }
Õâ¸öjoinµÄÔÀíºÜ¼òµ¥£¬Ç°ÃæÄÇЩifÌõ¼þ²»¹Ü£¬Ö÷Òª¿´whileÑ»·ÀïÃæµÄ£¬whileÑ»·¾ÍÊDz»¶ÏÈ¥ÅжÏthis.isAliveµÄ½á¹û£¬ÓÃÉÏÃæµÄÀý×Ó£¬Õâ¸öthis¾ÍÊÇjoinThread¡£È»ºó¹Ø¼üµÄ´úÂë¾ÍÊÇwait(delay);Ò»¸ö¶¨Ê±µÄwait¡£Õâ¸öwaitµÄ¶ÔÏóÒ²ÊÇthis,¾ÍÊÇjoinThread¡£ÉÏÃæÎÒÃÇÒѾ½²ÁËwaitÒ»¶¨ÒªÔÚͬ²½·½·¨»òÕßͬ²½´úÂë¿éÖУ¬Ô´ÂëÖÐjoin·½·¨µÄÐÞÊηû¾ÍÊÇÒ»¸ösynchronized£¬±íÃ÷ÕâÊÇÒ»¸öͬ²½µÄ·½·¨¡£
²»Òª¿´µ÷ÓÃwaitÊÇjoinThread£¬ÊÇÒ»¸öÏ̡߳£µ«ÊÇÕæÕýÒòΪwait½øÈë×èÈû״̬µÄ£¬ÊdzÖÓжÔÏó¼àÊÓÆ÷µÄỊ̈߳¬ÕâÀïµÄ¶ÔÏó¼àÊÓÆ÷ÊÇjoinThread,³ÖÓÐËûµÄÊÇmainỊ̈߳¬ÒòΪÔÚmainÏß³ÌÖÐÖ´ÐÐÁËjoinÕâ¸öͬ²½·½·¨¡£
ËùÒÔmainÏ̲߳»¶ÏµÄwait£¬Ö±µ½µ÷ÓÃjoin·½·¨ÄǸöÏ̶߳ÔÏóÏú»Ù£¬²Å¼ÌÐøÏòÏÂÖ´ÐС£
µ«ÊÇÔ´ÂëÖÐÖ»ÓÐwaitµÄ·½·¨£¬Ã»ÓÐnotifyµÄ·½·¨¡£ÒòΪnotifyÕâ¸ö²Ù×÷ÊÇJVMͨ¹ý¼ì²âÏ̶߳ÔÏóÏú»Ù¶øµ÷ÓõÄnative·½·¨£¬ÊÇC++ʵÏֵģ¬ÔÚÔ´ÂëÖÐÊÇÕÒ²»µ½¶ÔÓ¦Õâ¸öwait·½·¨¶ø´æÔÚµÄnotify·½·¨µÄ¡£
Ò²¾ÍÊÇ˵¡£
ÀûÓÃThread.join()·½·¨À´ÊµÏÖ£¬join()·½·¨µÄ×÷ÓÃÊǵȴýµ÷ÓÃÏß³ÌÖ´ÐÐÍêÖ®ºóÔÙÖ´ÐÐÈÎÎñ¡£
Õâ¸öÊDZØÐëÏß³ÌAÈ«²¿Ö´ÐÐÍ꣬ÔÙÈ¥Ö´ÐÐB.
Èç¹ûÊǽ»Ìæ´òÓ¡ÄØ£¿
±ØÐëʹÓÃwait()ºÍnotify()·½·¨¡£
Ò»µÀÃæÊÔÌâ¡£
±àдÁ½¸öỊ̈߳¬Ò»¸öÏ̴߳òÓ¡1~52£¬ÁíÒ»¸öÏ̴߳òÓ¡×ÖĸA~Z£¬´òӡ˳ÐòΪ12A34B56C……5152Z£¬ÒªÇóʹÓÃÏ̼߳äµÄͨÐÅ¡£
´úÂëÈçÏ£º
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by Edison Xu on 2019/12/15. */ public enum Helper { instance; private static final ExecutorService tPool = Executors.newFixedThreadPool(2); public static String[] buildNoArr(int max) { String[] noArr = new String[max]; for(int i=0;iʹÓÃwaitºÍnotify
public class MethodOne { private final ThreadToGo threadToGo = new ThreadToGo(); public Runnable newThreadOne() { final String[] inputArr = Helper.buildNoArr(52); return new Runnable() { private String[] arr = inputArr; public void run() { try { for (int i = 0; i < arr.length; i=i+2) { synchronized (threadToGo) { while (threadToGo.value == 2) threadToGo.wait(); Helper.print(arr[i], arr[i + 1]); threadToGo.value = 2; threadToGo.notify(); } } } catch (InterruptedException e) { System.out.println("Oops..."); } } }; } public Runnable newThreadTwo() { final String[] inputArr = Helper.buildCharArr(26); return new Runnable() { private String[] arr = inputArr; public void run() { try { for (int i = 0; i < arr.length; i++) { synchronized (threadToGo) { while (threadToGo.value == 1) threadToGo.wait(); Helper.print(arr[i]); threadToGo.value = 1; threadToGo.notify(); } } } catch (InterruptedException e) { System.out.println("Oops..."); } } }; } class ThreadToGo { int value = 1; } public static void main(String args[]) throws InterruptedException { MethodOne one = new MethodOne(); Helper.instance.run(one.newThreadOne()); Helper.instance.run(one.newThreadTwo()); Helper.instance.shutdown(); } }×¢Ò⣺
waitºÍnotify·½·¨±ØÐë·ÅÔÚͬ²½¿éÀïÃæ£¬ÒòΪҪ¶ÔӦͬһ¸ö¶ÔÏó¼àÊÓÆ÷¡£¶øsleepûÓÐ
ÔÀíÏê½â£º
wait·½·¨»áʹִÐиÃwait·½·¨µÄÏß³ÌÍ£Ö¹£¬Ö±µ½µÈµ½ÁËnotifyµÄ֪ͨ¡£Ï¸ËµÒ»Ï£¬Ö´ÐÐÁËwait·½·¨µÄÄǸöÏ̻߳áÒòΪwait·½·¨¶ø½øÈëµÈ´ý״̬£¬¸ÃÏß³ÌÒ²»á½øÈë×èÈû¶ÓÁÐÖС£¶øÖ´ÐÐÁËnotifyÄǸöÏß³ÌÔÚÖ´ÐÐÍêͬ²½´úÂëÖ®ºó»á֪ͨÔÚ×èÈû¶ÓÁÐÖеÄỊ̈߳¬Ê¹Æä½øÈë¾ÍÐ÷״̬¡£±»ÖØÐ»½ÐѵÄÏ̻߳áÊÔÍ¼ÖØÐ»ñµÃÁÙ½çÇøµÄ¿ØÖÆÈ¨£¬Ò²¾ÍÊǶÔÏóËø£¬È»ºó¼ÌÐøÖ´ÐÐÁÙ½çÇøÒ²¾ÍÊÇͬ²½Óï¾ä¿éÖÐwaitÖ®ºóµÄ´úÂë¡£
ÉÏÃæÕâ¸öÃèÊö£¬¿ÉÒÔ¿´³öһЩϸ½Ú¡£
1.wait·½·¨½øÈëÁË×èÈû¶ÓÁУ¬¶øÉÏÎĽ²¹ýÖ´ÐÐnotify²Ù×÷µÄÏß³ÌÓëÖ´ÐÐwaitµÄÏß³ÌÊÇÓµÓÐͬһ¸ö¶ÔÏó¼àÊÓÆ÷£¬Ò²¾Í˵wait·½·¨Ö´ÐÐÖ®ºó£¬Á¢¿ÌÊͷŵôËø£¬ÕâÑù£¬ÁíÒ»¸öÏ̲߳ÅÄÜÖ´ÐÐͬ²½´úÂë¿é£¬²ÅÄÜÖ´ÐÐnotify¡£
2.notifyÏ̻߳áÔÚÖ´ÐÐÍêͬ²½´úÂëÖ®ºó֪ͨÔÚ×èÈû¶ÓÁÐÖеÄỊ̈߳¬Ò²¾ÍÊÇ˵notifyµÄÄǸöÏ̲߳¢²»ÊÇÁ¢¼´ÊÍ·ÅËø£¬¶øÊÇÔÚͬ²½·½·¨Ö´ÐÐÍ꣬ÊÍ·ÅËøÒÔºó£¬wait·½·¨µÄÄǸöÏ̲߳Żá¼ÌÐøÖ´ÐС£
3.±»ÖØÐ»½ÐѵÄÏ̻߳áÊÔÍ¼ÖØÐ»ñµÃËø£¬Ò²¾Í˵£¬ÔÚnotify·½·¨µÄÏß³ÌÊͷŵôËøÒÔºó£¬Æä֪ͨµÄÏß³ÌÊDz»È·¶¨µÄ£¬¿´¾ßÌåÊÇÄÄÒ»¸ö×èÈû¶ÓÁÐÖеÄÏ̻߳ñÈ¡µ½¶ÔÏóËø¡£
ÕâÀïÏêϸ˵һÏ£¬Õâ¸ö½á¹û¡£waitʹÏ߳̽øÈëÁË×èÈû״̬£¬×èÈû״̬¿ÉÒÔϸ·ÖΪ3ÖÖ£º
¡ñ µÈ´ý×èÈû£ºÔËÐеÄÏß³ÌÖ´ÐÐwait·½·¨£¬JVM»á°Ñ¸ÃÏ̷߳ÅÈëµÈ´ý¶ÓÁÐÖС£
¡ñ ͬ²½×èÈû£ºÔËÐеÄÏß³ÌÔÚ»ñÈ¡¶ÔÏóµÄͬ²½ËøÊ±£¬Èô¸Ãͬ²½Ëø±»±ðµÄÏß³ÌÕ¼Óã¬ÔòJVM»á°Ñ¸ÃÏ̷߳ÅÈëËø³Øµ±ÖС£
¡ñ ÆäËû×èÈû£º ÔËÐеÄÏß³ÌÖ´ÐÐÁËThread.sleep»òÕßjoin·½·¨£¬»òÕß·¢³öI/OÇëÇóʱ£¬JVM»á°Ñ¸ÃÏß³ÌÖÃΪ×èÈû״̬¡£µ±sleep()״̬³¬Ê±¡¢join()µÈ´ýÏß³ÌÖÕÖ¹£¬»òÕß³¬Ê±¡¢»òÕßI/O´¦ÀíÍê±Ïʱ£¬Ïß³ÌÖØÐÂתÈë¿ÉÔËÐÐ״̬¡£
¿ÉÔËÐÐ״̬¾ÍÊÇÏß³ÌÖ´ÐÐstartʱ£¬¾ÍÊÇ¿ÉÔËÐÐ״̬£¬Ò»µ©CPUÇл»µ½Õâ¸öÏ߳̾ͿªÊ¼Ö´ÐÐÀïÃæµÄrun·½·¨¾Í½øÈëÁËÔËÐÐ״̬¡£
ÉÏÃæ»á³öÏÖÕâ¸ö½á¹û£¬¾ÍÊÇÒòΪnotify½ö½öÈÃÒ»¸öÏ߳̽øÈëÁË¿ÉÔËÐÐ״̬£¬¶øÁíÒ»¸öÏß³ÌÔò»¹ÔÚ×èÈûÖС£¶ønotifyAllÔòʹËùÓеÄÏ̶߳¼´ÓµÈ´ý¶ÓÁÐÖгöÀ´£¬¶øÒòΪͬ²½´úÂëµÄ¹ØÏµ£¬»ñµÃËøµÄÏ߳̽øÈë¿ÉÔËÐÐ̬£¬Ã»Óеõ½ËøµÄÔò½øÈëËø³Ø£¬Ò²ÊÇ×èÈû״̬£¬µ«ÊÇ»áÒòÎªËøµÄÊͷŶøÖØÐ½øÈë¿ÉÔËÐÐ̬¡£ËùÒÔnotifyAll»áÈÃËùÓÐwaitµÄÏ̶߳¼»á¼ÌÐøÖ´ÐС£
LockºÍCondition
ÈçºÎ³ÌÐò²»Ê¹ÓÃsynchronized¹Ø¼ü×ÖÀ´±£³Öͬ²½£¬¶øÊÇÖ±½ÓÊÊÓÃLock¶ÔÏñÀ´±£³Öͬ²½£¬ÔòϵͳÖв»´æÔÚÒþʽµÄͬ²½¼àÊÓÆ÷¶ÔÏó£¬Ò²¾Í²»ÄÜʹÓÃwait()¡¢notify()¡¢notifyAll()À´Ðµ÷Ï̵߳ÄÔËÐÐ.
µ±Ê¹ÓÃLOCK¶ÔÏó±£³Öͬ²½Ê±£¬JAVAΪÎÒÃÇÌṩÁËConditionÀàÀ´Ðµ÷Ï̵߳ÄÔËÐС£¹ØÓÚConditionÀ࣬JDKÎĵµÀï½øÐÐÁËÏêϸµÄ½âÊÍ.£¬ÔٴξͲ»†ªàÂÁË¡£
´úÂëÈçÏ£º
public class MethodTwo { private Lock lock = new ReentrantLock(true); private Condition condition = lock.newCondition(); private final ThreadToGo threadToGo = new ThreadToGo(); public Runnable newThreadOne() { final String[] inputArr = Helper.buildNoArr(52); return new Runnable() { private String[] arr = inputArr; public void run() { for (int i = 0; i < arr.length; i=i+2) { try { lock.lock(); while(threadToGo.value == 2) condition.await(); Helper.print(arr[i], arr[i + 1]); threadToGo.value = 2; condition.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } }; } public Runnable newThreadTwo() { final String[] inputArr = Helper.buildCharArr(26); return new Runnable() { private String[] arr = inputArr; public void run() { for (int i = 0; i < arr.length; i++) { try { lock.lock(); while(threadToGo.value == 1) condition.await(); Helper.print(arr[i]); threadToGo.value = 1; condition.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } } }; } class ThreadToGo { int value = 1; } public static void main(String args[]) throws InterruptedException { MethodTwo two = new MethodTwo(); Helper.instance.run(two.newThreadOne()); Helper.instance.run(two.newThreadTwo()); Helper.instance.shutdown(); } }Êä³ö½á¹ûºÍÉÏÃæÊÇÒ»ÑùµÄ£¡ Ö»²»¹ýÕâÀï ÏÔʾµÄʹÓÃLock¶ÔÏñÀ´³äµ±Í¬²½¼àÊÓÆ÷,ʹÓÃCondition¶ÔÏóÀ´ÔÝÍ£Ö¸¶¨Ị̈߳¬»½ÐÑÖ¸¶¨Ị̈߳¡
¹²Ïí±äÁ¿(volatile¡¢AtomicInteger)
volatileÐÞÊεıäÁ¿ÖµÖ±½Ó´æÔÚmain memoryÀïÃæ£¬×ÓÏ̶߳ԸñäÁ¿µÄ¶Áдֱ½ÓдÈëmain memory£¬¶ø²»ÊÇÏñÆäËü±äÁ¿Ò»ÑùÔÚlocal threadÀïÃæ²úÉúÒ»·Ýcopy¡£volatileÄܱ£Ö¤ËùÐÞÊεıäÁ¿¶ÔÓÚ¶à¸öÏ߳̿ɼûÐÔ£¬¼´Ö»Òª±»Ð޸쬯äËüÏ̶߳Áµ½µÄÒ»¶¨ÊÇ×îеÄÖµ¡£
´úÂëÈçÏ£º
public class MethodThree { private volatile ThreadToGo threadToGo = new ThreadToGo(); class ThreadToGo { int value = 1; } public Runnable newThreadOne() { final String[] inputArr = Helper.buildNoArr(52); return new Runnable() { private String[] arr = inputArr; public void run() { for (int i = 0; i < arr.length; i=i+2) { while(threadToGo.value==2){} Helper.print(arr[i], arr[i + 1]); threadToGo.value=2; } } }; } public Runnable newThreadTwo() { final String[] inputArr = Helper.buildCharArr(26); return new Runnable() { private String[] arr = inputArr; public void run() { for (int i = 0; i < arr.length; i++) { while(threadToGo.value==1){} Helper.print(arr[i]); threadToGo.value=1; } } }; } public static void main(String args[]) throws InterruptedException { MethodThree three = new MethodThree(); Helper.instance.run(three.newThreadOne()); Helper.instance.run(three.newThreadTwo()); Helper.instance.shutdown(); } }¹ÜµÀ
¹ÜµÀÁ÷ÊÇJAVAÖÐÏß³ÌͨѶµÄ³£Ó÷½Ê½Ö®Ò»£¬»ù±¾Á÷³ÌÈçÏ£º
1£©´´½¨¹ÜµÀÊä³öÁ÷PipedOutputStream posºÍ¹ÜµÀÊäÈëÁ÷PipedInputStream pis
2£©½«posºÍpisÆ¥Å䣬pos.connect(pis);
3£©½«pos¸³¸øÐÅÏ¢ÊäÈëỊ̈߳¬pis¸³¸øÐÅÏ¢»ñÈ¡Ị̈߳¬¾Í¿ÉÒÔʵÏÖÏ̼߳äµÄͨѶÁË
´úÂëÈçÏ£º
import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; public class testPipeConnection { public static void main(String[] args) { /** * ´´½¨¹ÜµÀÊä³öÁ÷ */ PipedOutputStream pos = new PipedOutputStream(); /** * ´´½¨¹ÜµÀÊäÈëÁ÷ */ PipedInputStream pis = new PipedInputStream(); try { /** * ½«¹ÜµÀÊäÈëÁ÷ÓëÊä³öÁ÷Á¬½Ó ´Ë¹ý³ÌÒ²¿Éͨ¹ýÖØÔØµÄ¹¹Ô캯ÊýÀ´ÊµÏÖ */ pos.connect(pis); } catch (IOException e) { e.printStackTrace(); } /** * ´´½¨Éú²úÕßÏß³Ì */ Producer p = new Producer(pos); /** * ´´½¨Ïû·ÑÕßÏß³Ì */ Consumer1 c1 = new Consumer1(pis); /** * Æô¶¯Ïß³Ì */ p.start(); c1.start(); } } /** * Éú²úÕßÏß³Ì(ÓëÒ»¸ö¹ÜµÀÊäÈëÁ÷Ïà¹ØÁª) * */ class Producer extends Thread { private PipedOutputStream pos; public Producer(PipedOutputStream pos) { this.pos = pos; } public void run() { int i = 0; try { while(true) { this.sleep(3000); pos.write(i); i++; } } catch (Exception e) { e.printStackTrace(); } } } /** * Ïû·ÑÕßÏß³Ì(ÓëÒ»¸ö¹ÜµÀÊäÈëÁ÷Ïà¹ØÁª) * */ class Consumer1 extends Thread { private PipedInputStream pis; public Consumer1(PipedInputStream pis) { this.pis = pis; } public void run() { try { while(true) { System.out.println("consumer1:"+pis.read()); } } catch (IOException e) { e.printStackTrace(); } } }³ÌÐòÆô¶¯ºó£¬¾Í¿ÉÒÔ¿´µ½producerÏß³ÌÍùconsumer1Ï̷߳¢ËÍÊý¾Ý¡£
consumer1:0 consumer1:1 consumer1:2 consumer1:3 ......¹ÜµÀÁ÷ËäȻʹÓÃÆðÀ´·½±ã£¬µ«ÊÇÒ²ÓÐһЩȱµã
1£©¹ÜµÀÁ÷Ö»ÄÜÔÚÁ½¸öÏß³ÌÖ®¼ä´«µÝÊý¾Ý
Ïß³Ìconsumer1ºÍconsumer2ͬʱ´ÓpisÖÐreadÊý¾Ý£¬µ±Ïß³ÌproducerÍù¹ÜµÀÁ÷ÖÐдÈëÒ»¶ÎÊý¾Ýºó£¬Ã¿Ò»¸öʱ¿ÌÖ»ÓÐÒ»¸öÏß³ÌÄÜ»ñÈ¡µ½Êý¾Ý£¬²¢²»ÊÇÁ½¸öÏ̶߳¼ÄÜ»ñÈ¡µ½producer·¢ËÍÀ´µÄÊý¾Ý£¬Òò´ËÒ»¸ö¹ÜµÀÁ÷Ö»ÄÜÓÃÓÚÁ½¸öÏ̼߳äµÄͨѶ¡£²»½ö½öÊǹܵÀÁ÷£¬ÆäËûIO·½Ê½¶¼ÊÇÒ»¶ÔÒ»´«Êä¡£
2£©¹ÜµÀÁ÷Ö»ÄÜʵÏÖµ¥Ïò·¢ËÍ£¬Èç¹ûÒªÁ½¸öÏß³ÌÖ®¼ä»¥Í¨Ñ¶£¬ÔòÐèÒªÁ½¸ö¹ÜµÀÁ÷
¿ÉÒÔ¿´µ½ÉÏÃæµÄÀý×ÓÖУ¬Ïß³Ìproducerͨ¹ý¹ÜµÀÁ÷ÏòÏß³Ìconsumer·¢ËÍÊý¾Ý£¬Èç¹ûÏß³ÌconsumerÏë¸øÏß³Ìproducer·¢ËÍÊý¾Ý£¬ÔòÐèҪн¨ÁíÒ»¸ö¹ÜµÀÁ÷pos1ºÍpis1£¬½«pos1¸³¸øconsumer1£¬½«pis1¸³¸øproducer£¬¾ßÌåÀý×Ó±¾ÎIJ»ÔÙ¶à˵¡£