public class Test {
/**
* 线程机制为了提高运行效率,当一个线程在不断的访问一个变量
* 线程会使用一个私有空间 存储这个变量
*
* volatile 关键字 易变变量
* 专门修饰被不同线程访问和修改的变量
* 让线程访问这个变量 每次都从变量原地址读取
* @param args
*/
public static void main(String[] args){
Object mutex = new Object();
new Producer(mutex).start();
new Consumer(mutex).start();
}
/**
* 产品
*/
static class Product{
public volatile static String value = null;
}
/**
* 消费者
*/
static class Consumer extends Thread{
private Object mutex;
public Consumer(Object mutex) {
this.mutex = mutex;
}
@Override
public void run() {
//一直消费产品
while (true){
synchronized (mutex){
//如果还没生产出产品 等待生产出产品
if (null == Product.value){
// System.out.println("consumer :"+Product.value);
// Product.value = null;
try {
mutex.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//使用
System.out.println("consumer :"+Product.value);
Product.value = null;
//通知生产者 可以生产了
mutex.notify();
}
}
}
}
/**
* 生产者
*/
static class Producer extends Thread{
private Object mutex;
public Producer(Object mutex) {
this.mutex = mutex;
}
@Override
public void run() {
//生产 产品
while (true){
synchronized (mutex){
//如果没有产品就生产
if (null != Product.value){
try {
mutex.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Product.value = "NO:"+System.currentTimeMillis();
System.out.println("producer ");
//通知消费者 可以消费了
mutex.notify();
}
}
}
}
}