Java.线程通信

//Java.线程通信 //Java是通过object类的wait、notify、notifyAll这几个方法来实现线程间的通信的。 //wait:告诉当前线程放弃监视器并进入睡眠状态,直到其他线程进入同一监视器并调用notify为止。 //notify:唤醒同一对象监视器中调用wait的第一个线程。 //notifyAll:唤醒同一对象监视器中调用wait的所有线程,具有最高优先级的线程首先被唤醒并执行。 //wait、notify、notifyAll这三个方法只能在synchronized方法中调用 class Q { private String name="李妮"; private String sex="女"; boolean bFull=false; public synchronized void put(String name,String sex) { try { if(bFull) wait(); } catch(Exception e) {e.printStackTrace();} this.name=name; this.sex=sex; bFull=true; notify(); } public synchronized void get() { try { if(!bFull) wait(); } catch(Exception e) {e.printStackTrace();} System.out.println(this.name+"----------->"+this.sex); bFull=false; synchronized(this) {notifyAll();} } } class Producer implements Runnable { int k=0; int i=0; Q q=null; public Producer(Q q) { this.q=q; } public void run() { while(k<10) //只存储10次。当K=10时,就不会再运行q.put()。q.get()读取完第10次,所在线程进入睡眠,并唤醒q.put()所在的线程,q.put()开始第11次装入数据,但是K=10,所以q.put()不会再运行,q.get()所在的线程无法被唤醒一直处于睡眠等待状态,程序就死在那里了。所以要在producer里面的循环体后面加一个notify()。 { if(i==0) { q.put("张三","男"); } else { q.put("李妮","女"); } i=(i+1)%2; k++; } synchronized(this) { notify(); //用于当k=10的时候,唤醒q.get()所在线程。(put比get先到达第十次) } } } class Consumer implements Runnable { Q q=null; public Consumer(Q q) { this.q=q; } public void run() { int k=0; while(k<10) { q.get(); k++; } } } class ThreadCommunation { public static void main(String [] args) { Q q=new Q(); new Thread(new Producer(q)).start(); new Thread(new Consumer(q)).start(); } }

你可能感兴趣的:(thread,exception,object,String,存储,Class)