下面简单的例子编写了java线程中的生产者消费者模型,分为两种编写方式,第一种运用synchroized进行线程同步,用wait()和notify(),notifyAll()进行线程通信,第二种运用lock进行线程同步,用Condition类中的await(),signal(),signalAll()进行线程通信。
一、
实体类:
public class BaoZi { private int number ; private boolean flag ; public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } }
生产者:
public class SetBZ implements Runnable{ private BaoZi baoZi; public SetBZ(BaoZi baoZi) { this.baoZi = baoZi; } @Override public void run() { while(true) { synchronized (baoZi) { if (baoZi.getNumber() > 0) { try { baoZi.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { baoZi.setNumber(baoZi.getNumber() + 1); System.out.println("sc" + 1 + "g,sy" + baoZi.getNumber() + "g"); baoZi.notify(); } } } } }
消费者:
public class GetBZ implements Runnable{ private BaoZi baoZi; public GetBZ(BaoZi baoZi) { this.baoZi = baoZi; } @Override public void run() { while (true) { synchronized (baoZi) { if (baoZi.getNumber() > 0) { baoZi.setNumber(baoZi.getNumber() - 1); System.out.println("xf" + 1 + "g,sy" + baoZi.getNumber() + "g"); baoZi.notify(); } else { try { baoZi.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }
测试类:
public class Text { public static void main(String[] args) { BaoZi baoZi = new BaoZi(); SetBZ setBZ = new SetBZ(baoZi); GetBZ getBZ = new GetBZ(baoZi); Thread t1 = new Thread(setBZ); Thread t2 = new Thread(getBZ); t1.start(); t2.start(); }
二、
实体类:
public class BaoZi { private int number ; private boolean flag ; public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } }
生产者:
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; public class SetBZ implements Runnable{ private BaoZi baoZi; private Condition notFull; private Condition notEmpty; private Lock lock; public SetBZ(BaoZi baoZi, Condition notFull, Condition notEmpty, Lock lock) { this.baoZi = baoZi; this.notFull = notFull; this.notEmpty = notEmpty; this.lock = lock; } public SetBZ(BaoZi baoZi) { this.baoZi = baoZi; } @Override public void run() { while(true) { lock.lock(); try { if (baoZi.getNumber() > 0) { notEmpty.await(); } else { baoZi.setNumber(baoZi.getNumber() + 1); System.out.println("sc" + 1 + "g,sy" + baoZi.getNumber() + "g"); notFull.signalAll(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } }
消费者:
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; public class GetBZ implements Runnable{ private BaoZi baoZi; private Condition notFull; private Condition notEmpty; private Lock lock; public GetBZ(BaoZi baoZi, Condition notFull, Condition notEmpty, Lock lock) { this.baoZi = baoZi; this.notFull = notFull; this.notEmpty = notEmpty; this.lock = lock; } public GetBZ(BaoZi baoZi) { this.baoZi = baoZi; } @Override public void run() { while (true) { lock.lock(); if (baoZi.getNumber() > 0) { baoZi.setNumber(baoZi.getNumber() - 1); System.out.println("xf" + 1 + "g,sy" + baoZi.getNumber() + "g"); notEmpty.signalAll(); } else { try { notFull.await(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } } } }
测试类:
public class Text { public static void main(String[] args) { Lock lock = new ReentrantLock(); Condition notFull = lock.newCondition(); Condition notEmpty = lock.newCondition(); BaoZi baoZi = new BaoZi(); SetBZ setBZ = new SetBZ(baoZi,notFull,notEmpty,lock); GetBZ getBZ = new GetBZ(baoZi,notFull,notEmpty,lock); Thread t1 = new Thread(setBZ); Thread t2 = new Thread(getBZ); t1.start(); t2.start(); } }