文中图片、知识点及其代码参考共3个来源:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913649.html
http://blog.csdn.net/liranke/article/details/12222265
http://www.cnblogs.com/wxd0108/p/5479442.html
如图中,一个线程调用start()之后进入Runnable状态等待JVM调用,JVM调用到则进入Running状态。
Running状态可以用join()或者sleep()进入block(阻塞)状态。
Running时wait()可以进入等待池,此时用notify()可以进入锁定池,等待同步锁释放时在回到Runnable状态等待调用
生产者消费者问题:
当生产者的产品堆满仓库时,需要停止生产并且尽快卖出产品。
当消费者买不到产品时(库存为0),提醒生产者继续生产。
package junitTest;
import java.util.ArrayList;
public class PCTest {
static ArrayList<Object> arrayList = new ArrayList<>();
public static final int MAX = 5;
int sum1=20;
int sum2=20;
class Producer extends Thread{
@Override
public void run() {
while(true){
synchronized (arrayList) {
if(arrayList.size()>=MAX){
System.out.println("产品已满");
try {
arrayList.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Object object = new Object();
arrayList.add(object);
System.out.println("加入第"+arrayList.size()+"个产品");
try {
Thread.sleep((long) (Math.random() * 3000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
arrayList.notify();
}
}
}
}
class Consumer extends Thread{
@Override
public void run() {
while(true){
synchronized (arrayList) {
if(arrayList.size()==0){
try{
System.out.println("产品已空");
arrayList.wait();
}catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
}
arrayList.remove(arrayList.size()-1);
System.out.println("移除第"+arrayList.size()+"个产品");
try {
Thread.sleep((long) (Math.random() * 3000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
arrayList.notify();
}
}
}
}
public void begin(){
new Producer().start();
new Consumer().start();
}
public static void main(String[] args) {
PCTest pcTest = new PCTest();
arrayList.clear();
pcTest.begin();
}
}
有错误请指出,谢谢。