您的位置:首页 > 其它

PV操作:读者写者问题

2015-09-06 09:45 399 查看
package concurrent;

import java.util.Date;
import java.util.concurrent.Semaphore;

public class WriterAndReader {
public static void main(String[] args) {
Semaphore resourceMutex = new Semaphore(1);
Semaphore readerCounterMutex= new Semaphore(1);
ReaderCount readerCount = new ReaderCount();
Semaphore priority = new Semaphore(1,true);

for(int i= 0 ; i <5; i++){
Thread thread;
if(i % 4 == 0){
thread = new Thread(new Writer(resourceMutex,priority));
}else{
thread = new Thread(new Reader(resourceMutex,readerCounterMutex,readerCount,priority));
}
thread.start();
}

}

}

class Writer implements Runnable {
Semaphore resourceMutex;
Semaphore priority;
public Writer(Semaphore resourceMutex, Semaphore priority) {
this.resourceMutex = resourceMutex;
this.priority = priority;
}

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
try {
Date date = new Date();
priority.acquire();
resourceMutex.acquire();
System.out.println("writer : " +Thread.currentThread().getName()+ " times " + i + " :"
);
resourceMutex.release();
priority.release();

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();

System.out.println("lock error");
}
}
}

}

class ReaderCount {

private int readerCount;

public ReaderCount() {
readerCount = 0;
}

public int addReader() {
++readerCount;
return readerCount;
}

public int minusReader() {
--readerCount;
return readerCount;
}

}

class Reader implements Runnable {
Semaphore resourceMutex;
Semaphore readerCounterMutex;
private ReaderCount readerCount;
Semaphore priority;

public Reader(Semaphore resourceMutex, Semaphore readerCounterMutex,
ReaderCount readerCount,Semaphore priority) {
this.resourceMutex = resourceMutex;
this.readerCounterMutex = readerCounterMutex;
this.readerCount = readerCount;
this.priority = priority;
}

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
try {
Date date = new Date();

priority.acquire();
readerCounterMutex.acquire();
if (readerCount.addReader() == 1) {
resourceMutex.acquire();
System.out.println("reader in");
}
readerCounterMutex.release();
priority.release();

System.out.println("reader : "+Thread.currentThread().getName() + " times " + i + " :"
);

readerCounterMutex.acquire();
if (readerCount.minusReader() == 0) {
System.out.println("reader out");
resourceMutex.release();
}
readerCounterMutex.release();

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("lock error");
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: