认识线程协调(监视器模型)

线程协调是个啥?

在多线程中,资源争夺是针对于某个资源而言的,也就是线程冲突(并发);资源协调是对于相关的资源分配而言的,也就是线程协调;

下面将以生产者-消费者模型,来认识线程协调:
须知代码出自Java语言程序设计(第3版)

生产者

package com.bjsxt.monitor;

public class Producer extends Thread {
	private Box box;

	public Producer(Box c) {
		box = c;
	}

	public void run() {
		for (int i = 0; i < 10; i++) {
			box.put(i);
			System.out.println("producer" + "put:" + i);
			try {
				sleep((int) (Math.random() * 100));
			} catch (InterruptedException e) {}
		}
	}

}

消费者

package com.bjsxt.monitor;

public class Consumer extends Thread {
	private Box box;

	public Consumer(Box c) {
		box = c;
	}

	public void run() {
		int value = 0;
		for (int i = 0; i < 10; i++) {
			value = box.get();
			System.out.println("Consumer" + "get:" + value);
			try {
				sleep((int) (Math.random() * 100));
			} catch (InterruptedException e) {}
		}
	}
}

高潮了,注意咯

非协调线程

package com.bjsxt.monitor;

public class Box {
	private int data;
	public synchronized void put(int value) {
		data=value;
	}
	public synchronized int get() {
		return data;
	}
	
}

注释内附有监视器模型设计解释

协调线程

package com.bjsxt.monitor;

//监视器模型:在生产和消费的两条上设置监管者,
//其实就是,生产和消费的开关,通过available告知是开还是关
//协调线程
public class Box {
	private int data;
	private boolean available = false;

	public synchronized void put(int value) {// 生产
		while (available == true) {// 生产的还未消耗,商品是可获得的。
			try { // 不需要生成,阻塞
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace(System.out);
			}
		}
		// 到这时,生产的已消耗完
		data = value;
		available = true;
		notifyAll();// 唤醒等待中生产线
	}

	public synchronized int get() {// 消费
		while (available == false) {// 商品不可获得,即卖完了
			try { // 无法消费,消费者停滞
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace(System.out);
			}
		}
		// 到这时。商品可以被获得
		available = false;
		notifyAll();// 唤醒消费者,可以消费该商品了;
		return data;// 被消费了
	}
}

测试

package com.bjsxt.monitor;

public class Test {
	public static void main(String[] args) {
		
		Box box=new Box();
		Producer producer =new Producer(box);
		Consumer consumer =new Consumer(box);
		producer.start();
		consumer.start();
	}
}

测试结果

一般线程(截取):

(这里有几种问题,读者可以自己想想)
Consumerget:0
producerput:0
Consumerget:0
producerput:1
Consumerget:1
producerput:2
Consumerget:2
producerput:3
Consumerget:3
producerput:4

线程协调(截取):

producerput:0
Consumerget:0
producerput:1
Consumerget:1
producerput:2
Consumerget:2
producerput:3
Consumerget:3
producerput:4
Consumerget:4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值