写在前面
- 不经意间遇到个很低级的错误,这个错误来源于会用JS的push,呃~~。java里面的数组是没有增添元素的方法的。我居然找了好会儿的往数组里面添加元素的方法,惭愧惭愧。知晓的东西是会渐渐被淡忘的,所以趁热打铁,记录一下线程使用的一个小案例吧。小白初识线程,认知肯定不足,望各位看官多多指点。
案例需求
- 就生产者消费者问题,实现需求: 生产1个商品便消费一个商品,即使多生产多消费亦是如此。
- 想法:程序运行稳定后的状态应该是一次生产一次消费,但是由于抢锁是随机,那么就有了两种现象:
- ① 用上Condition,每次唤醒的都是另一个线程,从运行过程上看,更像需求.
- ② 不采用Condition,那么唤醒的随机,就依靠flag状态来决定执不执行线程逻辑.
采用Condition线程队列
public class TheTest {
public static void main(String[] args) {
Goods goods = new Goods();
new Thread(new Consumer(goods)).start();
new Thread(new Producer(goods)).start();
new Thread(new Consumer(goods)).start();
new Thread(new Consumer(goods)).start();
}
}
public class Goods {
private static int number = 0;
private static boolean flag = true;
private static ReentrantLock lock = new ReentrantLock();
private static Condition pro_ = lock.newCondition();
private static Condition cus_ = lock.newCondition();
public void product() {
lock.lock();
cus_.signal();
if (flag){
System.out.println("厂家生产了第" + (++number) + "个产品!");
flag = !flag;
}
try {
pro_.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.unlock();
}
public void consume() {
lock.lock();
try {
cus_.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!flag){
System.out.println("买家消费了第" + (number--) + "个产品!");
flag = !flag;
}
pro_.signal();
lock.unlock();
}
}
public class Consumer implements Runnable {
private Goods goods;
public Consumer() {
}
public Consumer(Goods goods) {
this.goods = goods;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
goods.consume();
}
}
}
public class Producer implements Runnable {
private Goods goods;
public Producer() {
}
public Producer(Goods goods) {
this.goods = goods;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
goods.product();
}
}
}
不使用Condition
public class Goods {
private static int number = 0;
public static boolean flag = true;
public synchronized void product() {
if (flag) {
System.out.println("厂家生产了第" + (++number) + "个产品!");
flag = !flag;
}
notify();
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void consume() {
if (!flag) {
System.out.println("买家消费了第" + (number--) + "个产品!");
flag = !flag;
}
notify();
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}