首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

练手java thread(2)

2012-09-07 
练手java thread(二)生产者、消费者模型的demo:?1.程序入口:package thread.test01public class ThreadCom

练手java thread(二)

生产者、消费者模型的demo:

?

1.程序入口:

package thread.test01;public class ThreadCommunication {public static void main(String[] args) {Queue q = new Queue();new Thread(new Producer(q)).start();new Thread(new Consumer(q)).start();}}

?2.共享数据列表:

package thread.test01;public class Queue {String name = "unknown";String sex = "unknown";boolean bFull = false;}

3.生产者:

package thread.test01;public class Producer implements Runnable {private Queue q;public Producer(Queue q) {this.q = q;}@Overridepublic void run() {int i = 0;while (true) {synchronized (q) {// 当前线程得到对象q的lock旗标if (q.bFull) {try {q.wait();// 此时当前线程被放置在对象q的等待池中,当前线程释放q的锁旗标} catch (InterruptedException e) {e.printStackTrace();}}if (i == 0) {q.name = "zhangsan";try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}q.sex = "male";} else {q.name = "wangwu";q.sex = "female";}q.bFull = true;q.notify();// 当另外的线程执行了对象o的notify()方法后,当前线程可能会被从q的等待// 线程池中释放出来,并且移动到等待线程对象q的锁旗标的线程池中,当当前 //线程得到的锁旗标时就会执行下去}i = (i + 1) % 2;}}}

4.消费者:

package thread.test01;public class Consumer implements Runnable {private Queue q;public Consumer(Queue q) {this.q = q;}@Overridepublic void run() {while (true) {synchronized (q) {if (!q.bFull) {try {q.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.print(q.name);System.out.println(":" + q.sex);q.name = "unknown";q.sex = "unknown";q.bFull = false;q.notify();}}}}

?

?

理解监视器对象、synchronized、wait、notify之间的关系是根本。

?

根据oop的设计,重构以上代码:

//

package thread.test02;public class Queue {private String name = "unknown";private String sex = "unknown";private boolean bFull = false;public synchronized void put(String name, String sex) {if (bFull) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.name = name;try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}this.sex = sex;bFull = true;this.notifyAll();}public synchronized void get() {if (!bFull) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(name+":"+sex);try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}bFull = false;this.notifyAll();}}

?//

package thread.test02;public class Producer implements Runnable {private Queue q;public Producer(Queue q) {this.q = q;}@Overridepublic void run() {int i = 0;while (true) {if (i == 0) {q.put("zhangsan", "male");} else {q.put("wangwu", "female");}i = (i + 1) % 2;}}}

?//

package thread.test02;public class Consumer implements Runnable {private Queue q;public Consumer(Queue q) {this.q = q;}@Overridepublic void run() {while (true) {q.get();}}}
?

?

?

?

?

?

热点排行