千峰培训第六周

      这一周讲了两个方面。一是对上周讲的异常做一个收尾,讲了自定义异常和异常方法覆盖;二是本周学习的主要内容——进程。
      我翻了翻学校的教材和我从图书馆借来的书,对于异常并没有过多的描述,主要介绍了异常的三个关键字:try,catch,finally,掌握其中的语法并不难,运用某些方法(比如sleep)需要声明异常或是需要try-catch结构时,eclipse编译器也可以一键生成。Java作为面向对象的语言,异常机制也是为了用户在使用过程中,一旦运行不出来了,出现错误了,系统会自动给你提升。异常都带有统一的语法规范,只要明白了异常的存在性,那么经过熟练地练习,自然会使用异常处理机制了。
      本周用了三天时间来学习线程。以前在学校上操作系统课程的时候对线程有了初步的认识,比如FIFO、时间片计算。本周的课程是真正利用代码把线程工作机制运用的实践中,更为直观的表现一条程序多个进程是如何运行,以及如何加以控制。
      生产者消费者模型是比较常用的多线程应用场景。消费者想要购买商品必须要等待生产者先生产商品。当商品不充足时,消费者进程必须等待生产者进程先执行,生产者进程执行结束后才可以唤醒消费者进程继续执行。

public class TestProductorCustomer {
	public static void main(String[] args) {
		Shop shop = new Shop();

		Thread p = new Thread(new Productor(shop), "生产者");
		Thread c = new Thread(new Customer(shop), "消费者");

		p.start();
		c.start();
	}
}

class Productor implements Runnable {
	Shop shop;

	public Productor(Shop shop) {
		this.shop = shop;
	}

	public void run() {
		// 生产商品存放到shop里
		for (int i = 1; i <= 10; i++) {
			try {
				this.shop.saveGoods(new Goods(i));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

class Customer implements Runnable {
	Shop shop;

	public Customer(Shop shop) {
		this.shop = shop;
	}

	public void run() {
		for (int i = 1; i <= 10; i++) {
			try {
				this.shop.buyGoods();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

class Shop {
	Goods goods;
	boolean flag;// 标识商品是否充足
	// 生产者调用,存

	public synchronized void saveGoods(Goods goods) throws InterruptedException {
		// 1.判断商品充足
		if (flag == true) {
			System.out.println("商品充足");
			this.wait();// 商品充足,进入等待
		}
		// 商品不充足,生产商品,存到商场里
		System.out.println(Thread.currentThread().getName() + "生成并在商场里存放了" + goods.getId() + "件商品");
		this.goods = goods;
		flag = true;
		this.notifyAll();// 将等待队列的消费者唤醒
	}

	// 消费者调用,取
	public synchronized void buyGoods() throws InterruptedException {
		if (flag == false) {// 没有商品
			System.out.println("商品不充足");
			this.wait();// 进入等待队列,等待唤醒
		}
		// 正常购买商品
		System.out.println(Thread.currentThread().getName() + "购买了" + goods.getId() + "件商品");
		this.goods = null;
		flag = false;
		// 唤醒生产者
		this.notifyAll();
	}
}

class Goods {
	private int id;

	public Goods(int i) {
		this.id = i;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

}
商品不充足
生产者生成并在商场里存放了1件商品
商品充足
消费者购买了1件商品
商品不充足
生产者生成并在商场里存放了2件商品
商品充足
消费者购买了2件商品
商品不充足
生产者生成并在商场里存放了3件商品
商品充足
消费者购买了3件商品
商品不充足
生产者生成并在商场里存放了4件商品
商品充足
消费者购买了4件商品
商品不充足
生产者生成并在商场里存放了5件商品
商品充足
消费者购买了5件商品
商品不充足
生产者生成并在商场里存放了6件商品
商品充足
消费者购买了6件商品
商品不充足
生产者生成并在商场里存放了7件商品
商品充足
消费者购买了7件商品
商品不充足
生产者生成并在商场里存放了8件商品
商品充足
消费者购买了8件商品
商品不充足
生产者生成并在商场里存放了9件商品
商品充足
消费者购买了9件商品
商品不充足
生产者生成并在商场里存放了10件商品
消费者购买了10件商品
发布了40 篇原创文章 · 获赞 0 · 访问量 1138

猜你喜欢

转载自blog.csdn.net/qq_41841482/article/details/104861919
今日推荐