多线程synchronized、wait与notify

来源:互联网 发布:ecshop仿淘宝订单页面 编辑:程序博客网 时间:2024/04/29 22:11

例一:烧水和洗盘子

public class A {public static void main(String[] args) throws InterruptedException {Object object = 2;//烧到2水睡眠HeatWater heatWater=new HeatWater(object);Thread thread=new Thread(heatWater);DishWashing dishWashing=new DishWashing(object);Thread thread2=new Thread(dishWashing);thread.start();Thread.sleep(1000);//确保先进行thread线程thread2.start();}}

public class HeatWater implements Runnable{Object object;public HeatWater(Object object) {this.object = object;}@Overridepublic void run() {synchronized (object) {for (int i = 1; i < 5; i++) {System.out.println("烧"+i+"水");try {Thread.sleep(1500);if(i==Integer.parseInt(object.toString())){object.wait();}} catch (InterruptedException e) {e.printStackTrace();}}}}}


public class DishWashing implements Runnable{Object object;public DishWashing(Object object) {this.object = object;}@Overridepublic  void run() {synchronized (object) {for (int i = 1; i < 5; i++) {System.out.println("开始洗"+i+"盘子");try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}}object.notify();}}}

输出结果:
烧1水
烧2水
开始洗1盘子
开始洗2盘子
开始洗3盘子
开始洗4盘子
烧3水
烧4水

例二:抢票

public class A {public static void main(String[] args) {BuyTicket buyTicket = new BuyTicket();Thread t = new Thread(buyTicket, "红红");Thread t1 = new Thread(buyTicket, "翠花");t.start();t1.start();}}

public class BuyTicket  implements Runnable {// 票数int a = 100;public void run() {// 循环取票for (int i = 0; i <= 100; i++) {// 同步锁synchronized (this) {// 判断票数if (a > 0) {// 每取一次票的时候让票数-1a--;System.out.println(Thread.currentThread().getName() + "开始买票..");System.out.println(Thread.currentThread().getName() + "买票结束剩余.." + a + "张票");try { Thread.sleep(200);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}}
输出结果:
红红开始买票..
红红买票结束剩余..99张票
红红开始买票..
红红买票结束剩余..98张票
翠花开始买票..
翠花买票结束剩余..97张票
红红开始买票..
红红买票结束剩余..96张票
翠花开始买票..
翠花买票结束剩余..95张票
。。。。。



阅读全文
0 0