线程协调是个啥?
在多线程中,资源争夺是针对于某个资源而言的,也就是线程冲突(并发);资源协调是对于相关的资源分配而言的,也就是线程协调;
下面将以生产者-消费者模型,来认识线程协调:
须知:代码出自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