多线程:生产者、消费者问题——多线程的经典案例,一直都晕晕乎乎,今天再看,稍微有了那么点心得就总结一下,加深一下印象。
产生线程安全的原因:
1、多线程
2、操作共同资源
生产者、消费者首先操作的是同一资源,所以要解决首先得解决操作时的同步问题,应该把两者各自的生产和消费函数用synchronized和同一锁旗标锁起来,但这事实上只是解决了生产和消费过程互不打扰,却并没有解决生产和消费的有序过程,如果要解决还要借助于Thread从Object继承的wait()方法和 notify()方法,即当生产者完成后notify()消费者,并wait()等待消费,消费者完成后notify()生产者并wait()生产代码如下(下面代码转用同步代码块,更简洁明了):
class Producer implements Runnable { Q q; public Producer(Q q) { this.q=q; } public void run() { int i=0; while(true) { if(i==0) q.put("zhangsan","male"); else q.put("lisi","female"); i=(i+1)%2; } } } class Consumer implements Runnable { Q q; public Consumer(Q q) { this.q=q; } public void run() { while(true) { q.get(); } } } class Q { String name="unknown"; String sex="unknown"; boolean bFull=false; public synchronized void put(String name,String sex) //使用代码块实现同步,简洁明了!!! { if(bFull) try{wait();}catch(Exception e){} this.name=name; try{Thread.sleep(1);}catch(Exception e){} this.sex=sex; bFull=true; notify(); } public synchronized void get() { if(!bFull) try{wait();}catch(Exception e){} System.out.print(name); System.out.println(":"+sex); bFull=false; notify(); } }