建立Info类,用于生产的东西:
package rock.lee.thread.producer;
publicclass Info {
private String male; private String female;
public Info() { super(); }
public Info(String male, String female) { super(); this.male = male; this.female = female; }
public String getMale() { returnmale; }
publicvoid setMale(String male) { this.male = male; }
public String getFemale() { returnfemale; }
@Override public String toString() { return"Info [male=" + male + ", female=" + female + "]"; }
publicvoid setFemale(String female) { this.female = female; } }
|
建立生产者:
package rock.lee.thread.producer;
publicclass Producer implements Runnable {
private Info info = null;
public Producer(Info info) { super(); this.info = info; }
/** * 当flag标记位==true时,谢霆锋+张柏芝;flag=false时,陈冠希+钟欣桐 */ publicvoid run() { boolean flag = false; for (int i = 0; i < 50; i++) { if (flag) { this.info.setMale("谢霆锋"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.info.setFemale("张柏芝"); flag = false;// 改变标记位状态 } else { this.info.setMale("陈冠希"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.info.setFemale("钟欣桐"); flag = true; } } } }
|
建立消费者:
package rock.lee.thread.producer;
publicclass Consumer implements Runnable { private Info info = null;
public Consumer(Info info) { super(); this.info = info; } /** * 取出生产的数据 */ publicvoid run() { for (int i = 0; i < 50; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(info); } }
}
|
建立测试类:
package rock.lee.thread.producer;
publicclass TestThread { /** * @param args */ publicstaticvoid main(String[] args) { Info info = new Info(); Producer pro = new Producer(info);// 生产者 Consumer con = new Consumer(info);// 消费者 Thread tpro = new Thread(pro); Thread tcon = new Thread(con); tpro.start(); tcon.start(); } } |
运行结果:发现谢霆锋à钟欣桐、陈冠希à张柏芝,数据发生了错误:输出内容
Info [male=谢霆锋, female=钟欣桐] Info [male=陈冠希, female=张柏芝] Info [male=谢霆锋, female=钟欣桐] Info [male=陈冠希, female=张柏芝] Info [male=谢霆锋, female=钟欣桐] Info [male=陈冠希, female=张柏芝] …. |
问题解决:加入同步,使这4个人能够出现在正确的位置上。
修改Info类:
package rock.lee.thread.producer;
publicclass Info {
private String male; private String female;
public Info() { super(); }
public Info(String male, String female) { super(); this.male = male; this.female = female; }
@Override public String toString() { return"Info [male=" + male + ", female=" + female + "]"; }
public synchronized void set(String male, String female) { this.setMale(male); try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } this.setFemale(female); } public synchronized void get(){ System.out.println(this.toString()); } setter()、getter()…. |
修改Producer中的run():
/** * 当flag标记位==true时,谢霆锋+张柏芝;flag=false时,陈冠希+钟欣桐 */ publicvoid run() { boolean flag = false; for (int i = 0; i < 50; i++) { if (flag) { this.info.set("谢霆锋", "张柏芝"); // 设置数据 flag = false;// 改变标记位状态 } else { this.info.set("陈冠希", "钟欣桐"); flag = true; } } } |
修改Consumer中的run():
publicvoid run() { for (int i = 0; i < 50; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.info.get(); } } |
测试后发现:谢霆锋à张柏芝被消费过度了,出现多次取出的情况:输出内容
Info [male=陈冠希, female=钟欣桐] Info [male=谢霆锋, female=张柏芝] Info [male=陈冠希, female=钟欣桐] Info [male=谢霆锋, female=张柏芝] Info [male=陈冠希, female=钟欣桐] Info [male=谢霆锋, female=张柏芝] Info [male=谢霆锋, female=张柏芝] Info [male=谢霆锋, female=张柏芝] Info [male=谢霆锋, female=张柏芝] |
为了避免出现一个公众人物被过度消费的情况,加入等待唤醒,使谢霆锋和陈冠希可以同时被公众消费。
修改Info类中的set()和get():
publicsynchronizedvoid set(String male, String female) {
if (flag) {// true try { super.wait();// 线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } this.setMale(male); try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } this.setFemale(female); flag = true; super.notify();// 唤醒等待的线程 }
publicsynchronizedvoid get() { if (!flag) { try { super.wait();// 线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } System.out.println(this.toString()); flag = false; super.notify();// 唤醒等待的线程 } |
解决了,谢霆锋和陈冠希某一个人被过度消费的问题,让他们两位轮换着同时被消费:输出内容
Info [male=陈冠希, female=钟欣桐] Info [male=谢霆锋, female=张柏芝] Info [male=陈冠希, female=钟欣桐] Info [male=谢霆锋, female=张柏芝] Info [male=陈冠希, female=钟欣桐] Info [male=谢霆锋, female=张柏芝] Info [male=陈冠希, female=钟欣桐] |