面试的时候被问到了此问题,当时很惭愧。。。
自己回家百度的别人的做法,看到了这种方法比较简单。
测试并写下来,以备后用。
===================================================
资源类,生产者和消费者都是操作此资源
import java.util.Date;
publicclass Resource {
privateintnumber = 0;
/**
* 增加公共资源
*/
publicsynchronizedvoid increace() {
while (number >= 10) {
System.out.println(new Date()+ "-->too many resource!");
try {
wait();// 释放资源并等待
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(new Date()+ "-->continue increace!");
}
number++;
System.out.println(new Date()+ "-->increace to " + number);
notify();// 唤醒wait状态去抢资源
}
/**
* 减少公共资源
*/
publicsynchronizedvoid decreace() {
while (number < 1) {
System.out.println(new Date()+ "==>need resource!");
try {
wait();// 释放资源并等待
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(new Date()+ "==>continue decreace!");
}
number--;
System.out.println(new Date()+ "==>decreace to " + number);
notify();// 唤醒wait状态去抢资源
}
}
生产者类:主要是操作资源类的increace方法
publicclass Producer implements Runnable {
private Resource resource;
public Producer(Resource resource) {
this.resource = resource;
}
@Override
publicvoid run() {
while (true) {
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.increace();
}
}
}
消费者类:主要是操作资源类的decrease方法
publicclass Consumer implements Runnable {
private Resource resource;
public Consumer(Resource resource) {
this.resource = resource;
}
@Override
publicvoid run() {
while (true) {
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.decreace();
}
}
}
测试类:创建唯一资源、生产者和消费者。
publicclass MainTest {
publicstaticvoid main(String[] args) {
// 唯一资源,生产者和消费者都是操作这唯一资源
Resource resource = new Resource();
new Thread(new Producer(resource)).start();
new Thread(new Producer(resource)).start();
new Thread(new Producer(resource)).start();
new Thread(new Producer(resource)).start();
new Thread(new Consumer(resource)).start();
new Thread(new Consumer(resource)).start();
new Thread(new Consumer(resource)).start();
new Thread(new Consumer(resource)).start();
}
}