线程管理API
- Thread的部分已经废弃的API
- 暂停和恢复 supend/resume
- 消亡stop/destory
- 线程阻塞和唤醒
- sleep,时间一到,自己会醒来
- wait/notify/motifyAll,等待,需要别人来唤醒
- join,等待另外一个线程技术
- interrupt,等待另外一个线程发sing中断信号,该线程收到信号,会触发InterruptedException(可解除阻塞),并进行下一步处理
生产者消费者案例
案例描述:
- 生产者不断的往仓库里存放产品,消费者从仓库中消费产品。
- 其中生产者和消费者都可以有若干个
- 仓库规则:容量有限,库满时生产者不能存放产品,库空时消费者不能取产品
主函数:ProductTest.java
package product;
/**
* 经典生产者与消费者问题
* 生产者不断的往仓库中存放产品,消费者从仓库中消费产品。
* 其中生产者和消费者都可以有若干个。
* 仓库规则:容量有限,库满时不能存放,库空时不能取产品 。
*/
public class ProductTest {
public static void main(String[] args) throws InterruptedException {
Storage storage = new Storage();
//创建线程对象,两个生产者,两个消费者
Thread consumer1 = new Thread(new Consumer(storage));
consumer1.setName("消费者1");
Thread consumer2 = new Thread(new Consumer(storage));
consumer2.setName("消费者2");
Thread producer1 = new Thread(new Producer(storage));
producer1.setName("生产者1");
Thread producer2 = new Thread(new Producer(storage));
producer2.setName("生产者2");
//启动线程
producer1.start();
producer2.start();
//睡眠一秒钟
Thread.sleep(1000);
consumer1.start();
consumer2.start();
}
}
仓库:Storage.java
package product;
/**
*仓库
*/
class Storage {
// 定义一个产品数组,表示仓库容量为10,top=0表示指针初始索引位置
private Product[] products = new Product[10];
private int top = 0;
// 生产者往仓库中放入产品,push方法由synchronized 修饰,表示一次只能有一个生产者放产品
public synchronized void push(Product product) {
while (top == products.length) {
//当top等于数组长度10时,表示仓库已经满了
try {
System.out.println("producer wait");
wait();//仓库已满,等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//把产品放入仓库
products[top++] = product;
System.out.println(Thread.currentThread().