diuleilaomo通过本文主要向大家介绍了等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
线程间的通信:其实就是多个线程在操作同一个资源,但是操作的动作不同
当某个线程进入synchronized块后,共享数据的状态不一定满足该线程的需要,需要其他线程改变共享数据的状态后才能运行,而由于当时线程对共享资源时独占的,它必须解除对共享资源的锁定的状态,通知其他线程可以使用该共享资源。
Java中的 wait(),notify(),notifyAll()可以实现线程间的通信。
生产者–消费者问题是典型的线程同步和通信问题
- 生产者生成出产品,消费者去购买产品
- 创建三个线程,一个主控线程,一个生产者线程,一个消费者线程,
- 创建一个堆栈 Stack,生成线程生成的产品放置到堆栈中,然后消费者线程在堆栈中取走产品
/**
* 创建一个堆栈 Stack,生产者线程生成的产品放置到堆栈中,然后消费者线程在堆栈中取走产品
* Created by ZhangJun on 2017/10/21.
*/
public class ProductStack {
private int index = 0;
private String[] datas = new String[5];
/**
* 生成产品的方法
*
* @param product
*/
public synchronized void setProduct(String product) {
// 如果堆栈满了,调用wait()等待消费者取走产品
while (index == datas.length) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 生产者被唤醒后,开始放置产品到堆栈中
this.notify();
datas[index] = product;
System.out.println("生产者生产产品:" + product);
}
/**
* 获取产品的方法
*
* @return product
*/
public synchronized String getProduct() {
// 如果堆栈是空的,调用wait()等待生产者生产产品
while (index == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 消费者被唤醒后,开始从堆栈取走产品,然后通知生产者继续生产产品
this.notify();
index--;
System.out.println("消费者消费产品:" + datas[index]);
return datas[index];
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
/**
* 生产者类
* Created by ZhangJun on 2017/10/21.
*/
public class Producer extends Thread {
private ProductStack mProductStack;
public Producer(ProductStack ps) {
this.mProductStack = ps;
}
@Override
public void run() {
//生产线程
String[] str = {"娃哈哈", "百事可乐", "鲜橙多", "伊利优酸乳", "雪碧", "冰红茶"};
int random = (int) (Math.random() * str.length);
System.out.println(str[random]);
for (String aStr : str) {
mProductStack.setProduct(aStr);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
/**
* 消费者类
* Created by ZhangJun on 2017/10/21.
*/
public class Consumer extends Thread {
private ProductStack mProductStack;
public Consumer(ProductStack ps) {
this.mProductStack = ps;
}
@Override
public void run() {
//消费线程
String[] products = new String[6];
for (int i = 0; i < products.length; i++) {
products[i] = mProductStack.getProduct();
}
System.out.println("消费者消费的所有产品:" + products);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
/** * 主控线程 main * Created by ZhangJun on 2017/10/21. */ public class Main { public static void main(String[] args) { ProductStack mProductStack = new ProductStack(); new Producer(mProductStack).start(); new Consumer(mProductStack).start(); } }
北京激光祛斑http://www.6ysh.com/ 祛斑哪家好http://www.6ysh.com/
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13