class Resource{
String name;
int count = 1;
boolean flag = false;
public synchronized void set(String name){
while(this.flag){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.name = name + "---" + count++;;
System.out.println(Thread.currentThread().getName() + "productor" + this.name);
this.flag = true;
this.notifyAll();
}
public synchronized void out(){
while(!this.flag){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "...consumer..." + this.name);
this.flag = false;
this.notifyAll();
}
}
class Producer implements Runnable
{
Resource resource;
public Producer(Resource resource) {
// TODO Auto-generated constructor stub
this.resource = resource;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
resource.set("+QQ+");
}
}
}
class Consumer implements Runnable
{
Resource resource;
public Consumer(Resource resource) {
// TODO Auto-generated constructor stub
this.resource = resource;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
resource.out();
}
}
}
public class HeiMa {
public static void main(String[] args){
Resource resource = new Resource();
Producer producer = new Producer(resource);
Producer producer1 = new Producer(resource);
Consumer consumer = new Consumer(resource);
Consumer consumer1 = new Consumer(resource);
Thread t1 = new Thread(producer);
Thread t2 = new Thread(consumer);
Thread t3 = new Thread(consumer);
Thread t4 = new Thread(producer);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
//新版本的解决办法
//l利用Lock,Condition方法 本来想深入研究,但是明天要参加面试所以先发表等参加完面试在来解决
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Resource{
String name;
int count = 1;
boolean flag = false;
ReentrantLock reentrantLock = new ReentrantLock();
Condition condition_con = reentrantLock.newCondition();
Condition condition_pro = reentrantLock.newCondition();
public void set(String name) throws InterruptedException{
try{
reentrantLock.lock();
if(flag)
condition_pro.await();
this.name = name + "---" + count++;;
System.out.println(Thread.currentThread().getName() + "productor" + this.name);
this.flag = true;
condition_con.signalAll();
}finally{
reentrantLock.unlock();
}
}
public synchronized void out() throws InterruptedException{
try{
reentrantLock.lock();
if(!flag)
condition_con.await();
System.out.println(Thread.currentThread().getName() + "...consumer..." + this.name);
this.flag = false;
condition_pro.signalAll();
}finally{
reentrantLock.unlock();
}
}
}
class Producer implements Runnable
{
Resource resource;
public Producer(Resource resource) {
// TODO Auto-generated constructor stub
this.resource = resource;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
resource.set("+QQ+");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable
{
Resource resource;
public Consumer(Resource resource) {
// TODO Auto-generated constructor stub
this.resource = resource;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
resource.out();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class HeiMa {
public static void main(String[] args){
Resource resource = new Resource();
Producer producer = new Producer(resource);
Producer producer1 = new Producer(resource);
Consumer consumer = new Consumer(resource);
Consumer consumer1 = new Consumer(resource);
Thread t1 = new Thread(producer);
Thread t2 = new Thread(consumer);
Thread t3 = new Thread(consumer);
Thread t4 = new Thread(producer);
t1.start();
t2.start();
t3.start();
t4.start();
}
}