线程间通信

来源:互联网 发布:淘宝详情页文字大小 编辑:程序博客网 时间:2024/06/04 19:55
子线程循环10次,主线程循环100次交替循环50次
public class TraditionalThreadCommunication {    public static void main(String[] args) {        final Business business = new Business();        new Thread(                new Runnable() {                    @Override                    public void run() {                        for (int i = 1; i <= 50 ; i++) {                            business.sub(i);                        }                    }                }        ).start();        for (int i = 1; i <= 50 ; i++) {            business.main(i);        }    }}class Business{    private boolean bShouldSub = true;    public synchronized void sub(int i){        if(!bShouldSub){            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        for (int j = 1; j <=10 ; j++) {            System.out.println("sub thread sequence of " + j + ",loop of " + i);        }        bShouldSub = false;        this.notify();    }    public synchronized void main(int i){        while(bShouldSub){            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        for (int j = 0; j <=100 ; j++) {            System.out.println("main thread sequence of " + j + ",loop of " + i);        }        bShouldSub = true;        this.notify();    }}

用Lock的方法
public class ConditionCommunication {    public static void main(String[] args) {        final Business business = new Business();        new Thread(                new Runnable() {                    @Override                    public void run() {                        for(int i=1;i<=50;i++){                            business.sub(i);                        }                    }                }        ).start();        for(int i=1;i<=50;i++){            business.main(i);        }    }    static class Business{        Lock lock = new ReentrantLock();        Condition condition = lock.newCondition();        private boolean bShouldSub = true;        public void sub(int i){            lock.lock();            try {                while (!bShouldSub){                    try {                        condition.await();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }                for(int j=1;j<=10;j++){                    System.out.println("sub thread sequence of " + j + ",loop of " + i);                }                bShouldSub = false;                condition.signal();            } finally {                lock.unlock();;            }        }        public void main(int i){            lock.lock();            try {                while (bShouldSub){                    try {                        condition.await();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }                for(int j=1;j<=100;j++){                    System.out.println("main thread sequence of " + j + ",loop of " + i);                }                bShouldSub = true;                condition.signal();            } finally {                lock.unlock();;            }        }    }}

三个线程通信
import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ThreeConditionCommunication {/** * @param args */public static void main(String[] args) {final Business business = new Business();new Thread(new Runnable() {@Overridepublic void run() {for(int i=1;i<=50;i++){business.sub2(i);}}}).start();new Thread(new Runnable() {@Overridepublic void run() {for(int i=1;i<=50;i++){business.sub3(i);}}}).start();for(int i=1;i<=50;i++){business.main(i);}}static class Business {Lock lock = new ReentrantLock();Condition condition1 = lock.newCondition();Condition condition2 = lock.newCondition();Condition condition3 = lock.newCondition();  private int shouldSub = 1;  public  void sub2(int i){  lock.lock();  try{  while(shouldSub != 2){  try {condition2.await();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}  }for(int j=1;j<=10;j++){System.out.println("sub2 thread sequence of " + j + ",loop of " + i);}  shouldSub = 3;  condition3.signal();  }finally{  lock.unlock();  }  }  public  void sub3(int i){  lock.lock();  try{  while(shouldSub != 3){  try {condition3.await();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}  }for(int j=1;j<=20;j++){System.out.println("sub3 thread sequence of " + j + ",loop of " + i);}  shouldSub = 1;  condition1.signal();  }finally{  lock.unlock();  }  }      public  void main(int i){  lock.lock();  try{ while(shouldSub != 1){  try {condition1.await();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}  }for(int j=1;j<=100;j++){System.out.println("main thread sequence of " + j + ",loop of " + i);}shouldSub = 2;condition2.signal();  }finally{  lock.unlock();  }  }}}



原创粉丝点击