ƵµÀÀ¸Ä¿
Ê×Ò³ > ³ÌÐò¿ª·¢ > Èí¼þ¿ª·¢ > Java > ÕýÎÄ
javaÏß³ÌÖ®¼äµÄͨÐÅ·½Ê½ÊµÀý½²½â
2019-12-15 14:46:21         À´Ô´£ºnwpu_geekerµÄ²©¿Í  
Êղؠ  ÎÒҪͶ¸å

ÒýÑÔ

µ±¶à¸öÏß³ÌÐèҪЭ×÷À´Íê³ÉÒ»¼þÊÂÇéµÄʱºò£¬ÈçºÎÈ¥µÈ´ýÆäËûÏß³ÌÖ´ÐУ¬ÓÖÈçºÎµ±Ïß³ÌÖ´ÐÐÍêȥ֪ͨÆäËûÏ߳̽áÊøµÈ´ý¡£

Ïß³ÌÓë½ø³ÌµÄÇø±ð

½ø³Ì¿ÉÒÔ¶ÀÁ¢ÔËÐУ¬ËüÊÇϵͳ½øÐÐ×ÊÔ´·ÖÅäºÍµ÷¶ÈµÄ¶ÀÁ¢µ¥Î»¡£

Ïß³ÌÊǽø³ÌµÄÒ»¸öʵÌ壬ÊÇCPUµ÷¶ÈºÍ·ÖÅɵĻù±¾µ¥Î»£¬±È½ø³Ì¸üСµÄ¶ÀÁ¢µ¥Î»£¬Ëü»ù±¾Éϲ»ÓµÓÐϵͳ×ÊÔ´¡£

ËûÃÇÖ®¼äµÄÁªÏµ£º

Ò»¸öÏß³ÌÊôÓÚÒ»¸ö½ø³Ì£¬¶øÒ»¸ö½ø³ÌÓжà¸öỊ̈߳¬¶à¸öÏ̹߳²Ïí¸Ã½ø³ÌµÄËùÓÐ×ÊÔ´¡£

Çø±ð£º

1.µ÷¶È£ºÏß³Ì×÷ΪCPUµ÷¶ÈºÍ·ÖÅɵĻù±¾µ¥Î»£¬½ø³ÌÓµÓÐϵͳ×ÊÔ´µÄ¶ÀÁ¢µ¥Î»¡£

2.²¢·¢ÐÔ£º½ø³ÌÖ®¼ä²¢·¢ÔËÐУ¬Í¬Ò»¸ö½ø³ÌµÄ¶à¸öÏß³ÌÒ²Äܲ¢·¢Ö´ÐС£

3.ÓµÓÐ×ÊÔ´£¬½ø³ÌÊÇÓµÓÐϵͳ×ÊÔ´µÄ»ù±¾µ¥Î»£¬Ï̲߳»ÓµÓÐ×ÊÔ´£¬µ«ÄÜ·ÃÎʽø³ÌµÄ×ÊÔ´¡£

Ïß³ÌÖ®¼äµÄͨÐÅ·½Ê½ÓÐÄÄЩ

1.join

2.¹²Ïí±äÁ¿(volatile¡¢AtomicInteger)

3.notify/wait

4.lock/condition

5.¹ÜµÀ

join

Ê×ÏÈ£¬¿ªÆôÁ½¸öỊ̈߳¬·Ö±ð´òÓ¡123£¬Ïß³ÌAºÍÏß³ÌB»á²»°´Ì×·´òÓ¡¡£

Èç¹û±ØÐëÒªÏß³ÌAÔÚÏß³ÌB֮ǰ´òÓ¡123ÄØ£¿

ÐèҪʹÓÃthread1.join();//ÎÒ»áµÈ´ýÏß³Ì1Ö´ÐÐÍê³ÉºóÔÙ½øÐÐÖ´ÐÐ

joinµÄÔ­Àí

ʵ¼ÊÉÏ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

Èç¹ûÊǽ»Ìæ´òÓ¡ÄØ£¿

±ØÐëʹÓÃ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»ÔÙ¶à˵¡£

µã»÷¸´ÖÆÁ´½Ó ÓëºÃÓÑ·ÖÏí!»Ø±¾Õ¾Ê×Ò³
ÉÏһƪ£ºjavaÅÅÐòË㷨ѧϰ֮ðÅÝ£¬Ñ¡ÔñÅÅÐò£¬¶þ·Ö²éÕÒ£¬¹¤¾ßÀàµÈʵÏÖ½²½â
ÏÂһƪ£ºjavaÏ̷߳½·¨Ö®join¼òµ¥×ܽᣨ´úÂëʵÀý£©
Ïà¹ØÎÄÕÂ
ͼÎÄÍÆ¼ö
µã»÷ÅÅÐÐ

¹ØÓÚÎÒÃÇ | ÁªÏµÎÒÃÇ | ¹ã¸æ·þÎñ | Ͷ×ʺÏ×÷ | °æÈ¨ÉêÃ÷ | ÔÚÏß°ïÖú | ÍøÕ¾µØÍ¼ | ×÷Æ··¢²¼ | Vip¼¼ÊõÅàѵ | ¾Ù±¨ÖÐÐÄ

°æÈ¨ËùÓÐ: È«·å°²È«ÁªÃË--ÖÂÁ¦ÓÚ×öʵÓõÄIT¼¼ÊõÑ§Ï°ÍøÕ¾