Java并发控制实例(读者与写者)

package com.asmn.test;

import static com.asmn.tools.Tools.*;

public class Test {
	public static void main(String[] args){
		Signal signal = new Signal();
		pl("start writer");
		new Thread(new Writer(3,signal)).start();
		pl("start reader");
		new Thread(new Reader(2,signal)).start();
	}
}
package com.asmn.test;

import static com.asmn.tools.Tools.*;

public class Writer implements Runnable {

	public static final String className = "W";
	
	private int sum;
	private Signal signal;
	public Writer(int sum, Signal signal){
		this.sum = sum;
		this.signal = signal;
	}
	
	@Override
	public void run(){
		boolean flag = true;
		int n = 1;
		while(flag){
			try {
				
				//判断资源是否被占用
				while(signal.getSignal()){
					signal.doWait(className);
				}
				
				//资源使用
				signal.setSignal(true);
				pl(n+"w--->A");
				
				//结束资源使用
				signal.setSignal(false);
				pl((n++)+"w--->B");
				signal.doNotify();

				flag = n > sum ? false : true;
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		pl("over writer");
	}
}

package com.asmn.test;

import static com.asmn.tools.Tools.*;

public class Reader implements Runnable {

	public static final String className = "R";
	
	private int sum;
	private Signal signal;
	public Reader(int sum, Signal signal){
		this.sum = sum;
		this.signal = signal;
	}
	
	@Override
	public void run(){
		boolean flag = true;
		int n = 1;
		while(flag){
			try {
				
				//判断资源是否被占用
				while(signal.getSignal()){
					signal.doWait(className);
				}
				
				//资源使用
				signal.setSignal(true);
				pl(n+"R--->A");
				
				//结束资源使用
				signal.setSignal(false);
				pl((n++)+"R--->B");
				signal.doNotify();

				flag = n > sum ? false : true;
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		pl("over reader");
	}
}

package com.asmn.test;

import static com.asmn.tools.Tools.*;

public class Signal {
	private Object lock = new Object();
	
	private boolean use = false;
	
	public synchronized boolean getSignal(){
		return this.use;
	}
	
	public synchronized void setSignal(boolean use){
		this.use = use;
	}
	
	public void doWait(String className){
		synchronized(lock){
			try {
				pl("文件正在被占用,等待... ----> " + className);
				lock.wait();//当调用了wait()时,锁将被释放
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void doNotify(){
		synchronized(lock){
			lock.notify();
		}
	}
	
}

package com.asmn.tools;

public class Tools {
	public static void pl(Object o){
		System.out.println(o);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值