class Producer implements Runnable{Q q;public Producer(Q q){this.q = q;}public void run(){int i = 0;while(true){synchronized(q){if(q.bFull)try{q.wait();}catch(Exception e){}if(i == 0){q.name = "zhangsan";try{Thread.sleep(1);}catch(Exception e){}q.sex = "male";}else{q.name = "lisi";q.sex = "female";}q.bFull = true;q.notify();}i = (i+1)%2;}}}class Consumer implements Runnable{Q q;public Consumer(Q q){this.q = q;}public void run(){while(true){synchronized(q){if(!q.bFull)try{q.wait();}catch(Exception e){}System.out.print(q.name);System.out.println(":" + q.sex);q.bFull = false;q.notify();}}}}class ThreadCommunication{public static void main(String [] args){Q q = new Q();new Thread(new Producer(q)).start();new Thread(new Consumer(q)).start();}}class Q{String name = "unknown";String sex = "unknown";boolean bFull = false;}
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("zhangshan", "male");elseq.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 ThreadCommunication{public static void main(String [] args){Q q = new Q();new Thread(new Producer(q)).start();new Thread(new Consumer(q)).start();}}class Q{private String name = "unknown";private String sex = "unknown";private 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();}}
class ThreadCommunication{public static void main(String [] args){ThreadTest t = new ThreadTest();new Thread(t).start();for(int i=0; i<100; i++){if(i == 50)t.stopMe();System.out.println("main() is running");}}}class ThreadTest implements Runnable{private boolean bStop = false;public void stopMe(){bStop = true;}public void run(){while(!bStop){System.out.println(Thread.currentThread().getName() + "is running");}}}